Android中同时显示多个警报 [英] Multiple alarms at the same time in Android
问题描述
我在这个问题上陷入困境.我已经阅读了很多关于堆栈溢出的解决方案,但是这些解决方案都没有解决我的问题.
I'm stuck on this problem. I've read many solutions on stack overflow but none of these have solved my problem.
这是我的代码: 在我的主要活动中,我写了这个-
Here's my code: In my Main Activity, I wrote this--
this.context = this;
Intent alarm = new Intent(this.context, AlarmManager.class);
boolean alarmRun = (PendingIntent.getBroadcast(this.context,0,alarm, PendingIntent.FLAG_NO_CREATE) != null);
if (alarmRun == false){
PendingIntent pending = PendingIntent.getBroadcast(this.context, 0, alarm, 0);
AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 15000, pending);
}
因此,第一次打开该应用程序时,将调用Broadcast Receiver,即AlarmManager.java. 这是我在警报管理器"中所做的操作: 在我的onReceive中-
So the first time the app is opened a Broadcast Receiver is called which is the AlarmManager.java. Here's what I did in my Alarm Manager: In my onReceive--
AlarmDB db = new AlarmDB (context);
List<Alarm> alarms = db.getAlarm();
if(alarms != null)
{
for (Alarm alarm : alarms)
{
Calendar calendar = Calendar.getInstance();
final int nowHour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
final int nowMinute = Calendar.getInstance().get(Calendar.MINUTE);
final int nowDay = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(alarm.getAlarmHour()));
calendar.set(Calendar.MINUTE, Integer.parseInt(alarm.getStartTimeMinute()));
calendar.set(Calendar.SECOND, 00);
PendingIntent pIntent = createPendingIntent(context, alarm);
if (!(Integer.parseInt(alarm.getAlarmHour()) < nowHour) && !(Integer.parseInt(alarm.getAlarmHour()) == nowHour && Integer.parseInt(alarm.getStartTimeMinute()) <= nowMinute))
{
AlarmManager alarmMgr = (AlarmManager)c.getSystemService(Context.ALARM_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT)
{
alarmMgr.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
} else {
alarmMgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
}
}
}
}
这是我单独制作的createPendingIntent方法:
And here's the createPendingIntent method I separately made:
private static PendingIntent createPendingIntent(Context context, Alarm m) {
Intent i = new Intent(context, AlarmService.class);
i.putExtra(ID, m.getID());
i.putExtra(NAME, m.getMedName());
return PendingIntent.getService(context, m.getID(), i, PendingIntent.FLAG_UPDATE_CURRENT);
}
因此,每次当前时间与数据库中的时间匹配时,都会通过我的AlarmManager活动中的服务触发意图.请注意,在调用getService时,请求代码是数据库中的唯一ID.我的问题是,尽管我使用的是唯一的ID,但每次同时触发2个或更多警报时,只有其中一个成功触发.那我该怎么办呢?
So everytime the current time matches the time from the database an intent is fired through a service which is in my AlarmManager activity. Notice that in calling the getService, the request code is the unique id from database. My problem is eventhough I am using a unique id, everytime there is 2 or more alarm to be fired at the same time only one of those is sucessfully fired. So how should I do this?
推荐答案
if (alarmRun == false){
PendingIntent pending = PendingIntent.getBroadcast(this.context, 0, alarm, 0);
AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 15000, pending);
}
调用setRepeating
将导致以15000毫秒的间隔多次触发BroadcastReceiver
.改为使用setExact
.
Calling setRepeating
will cause the BroadcastReceiver
to be triggered multiple times at an interval of 15000 milliseconds. Use setExact
instead.
这篇关于Android中同时显示多个警报的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!