我正在使用此代码设置警报
//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的警报(等于2)意图由filterEquals(Intent)定义,然后它将被删除并替换为这个...
这表明对已经报警的意图调用set(int type,long triggetAtTime,PendingIntent操作)应该替换该意图的旧警报 . 我没有看到任何警报被丢弃 . 相反,我设置的每个警报都会触发,尽管由待处理意图触发的意图应该全部匹配(通过filterEquals(intent)),因为我在每个意图上设置的所有意图都是相同的动作 .
我做错了什么,或者API的行为不符合记录?
注意:将PendingIntent实例化更改为
PendingIntent pendIntent = PendingIntent.getBroadcast(
getApplicationContext(), CONSTANT_ID,
intent, PendingIntent.FLAG_ONE_SHOT);
按预期运行,丢弃任何已设置的警报,并将其替换为新警报 .
3 回答
也许是因为你给每个警报一个不同的ID(
alert.getID()
是否给出不同的ID?) . 通过文档,它很重要,但你仍然应该尝试 .如果它也不起作用,请保留上次设置警报的参考,当您需要取消它时,请自行取消,然后设置下一个警报 .
你试过PendingIntent标志:
PendingIntent.FLAG_UPDATE_CURRENT
intead ofPendingIntent.FLAG_ONE_SHOT
?似乎共识是AlarmManager.set()的文档,以及其他AlarmManager方法声称Intents(不仅仅是包装PendingIntents)被比较以检查是否已经设置了特定警报 .
不要依赖于AlarmManager匹配的Intents,而是依赖于PendingIntents的匹配,这似乎与宣传的一样 .