【发布时间】:2011-10-31 18:31:08
【问题描述】:
我正在使用此代码设置警报
//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 安排了警报(两个 Intent 的相等性由 filterEquals(Intent) 定义),那么它将被删除并替换为这个...
这表明为已经报警的意图调用 set(int type, long triggetAtTime, PendingIntent 操作) 应该替换该意图的旧报警。我没有看到任何警报被丢弃。相反,我设置的每个警报都会触发,尽管待处理的 Intent 触发的 Intent 都应该匹配(通过 filterEquals(intent)),因为我在每个 Intent 上设置的所有内容都是相同的操作。
是我做错了什么,还是 API 的行为不像记录的那样?
注意:将 PendingIntent 实例化更改为
PendingIntent pendIntent = PendingIntent.getBroadcast(
getApplicationContext(), CONSTANT_ID,
intent, PendingIntent.FLAG_ONE_SHOT);
按预期运行,删除任何已设置的警报,并将其替换为新警报。
【问题讨论】:
-
尝试摆脱
alarm.getID()并使用0。 -
在下面查看我对 jong 回答的评论。
标签: android alarmmanager alarms