我正在使用此代码设置闹钟
//in onCreate()
mAlarmManager = (AlarmManager) getApplicationContext()
.getSystemService(ALARM_SERVICE);
//called for each timer I schedule
Intent intent = new Intent (Intents.MY_INTENT_ACTION);
PendingIntent pendIntent = PendingIntent.getBroadcast(
getApplicationContext(), alert.getID(),
intent, PendingIntent.FLAG_ONE_SHOT);
long delay = 1000 * alert.getDuration();
Calendar cal = Calendar.getInstance();
mAlarmManager.set(AlarmManager.RTC_WAKEUP,
cal.getTimeInMillis() + delay, pendIntent);
但我所看到的行为与我在文件中应该看到的不相符1,
public void set(int type,long triggerAtTime,PendingIntent operation)
如果已经为同一个IntentSender安排了一个警报,它将首先被取消...如果已经安排了此Intent的警报(两个意图的相等性由filterEquals(Intent)定义),那么它将被删除并替换为这个......
表明对已经报警的意图调用set(int type,long triggetAtTime,PendingIntent操作)应该替换该意图的旧警报。我没有看到任何警报被丢弃。相反,我设置的每个警报都会触发,尽管由待处理意图触发的意图应该全部匹配(通过filterEquals(intent)),因为我为每个意图设置的所有意图都是相同的动作。
我做错了什么,或者API的行为不符合记录?
注意:将PendingIntent实例化更改为
PendingIntent pendIntent = PendingIntent.getBroadcast(
getApplicationContext(), CONSTANT_ID,
intent, PendingIntent.FLAG_ONE_SHOT);
按预期行事,删除任何已设置的警报,并将其替换为新警报。
答案 0 :(得分:0)
也许是因为你给每个警报一个不同的ID(alert.getID()
是否给出了不同的ID?)。通过文档,不应该重要,但你还是应该尝试。
如果它也不起作用,请保留上次设置闹钟的参考,当您需要取消它时,请自行取消,然后设置下一个。
答案 1 :(得分:0)
您是否尝试使用PendingIntent标记:PendingIntent.FLAG_UPDATE_CURRENT
而不是PendingIntent.FLAG_ONE_SHOT
?
答案 2 :(得分:0)
看来,共识是AlarmManager.set()的文档以及声称Intents(不仅仅是包装PendingIntents)的其他AlarmManager方法被比较以检查是否已经设置了特定警报。
不要依赖AlarmManager匹配的Intents,而是依赖PendingIntents的匹配,这似乎与宣传的一样。