0

我正在使用此代码设置警报

//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);

行为符合预期,丢弃任何已设置的警报,并用新警报替换它。

4

3 回答 3

0

也许是因为您给每个警报一个不同的 ID(是否alert.getID()提供不同的 ID?)。根据文档,这无关紧要,但您仍然应该尝试。

如果它也不起作用,请为您上次设置的闹钟保留一个参考,当您需要取消它时,自己取消它然后设置下一个。

于 2011-10-31T18:41:37.970 回答
0

您是否尝试过使用 PendingIntent 标志:PendingIntent.FLAG_UPDATE_CURRENTPendingIntent.FLAG_ONE_SHOT不是?

于 2011-10-31T18:48:56.687 回答
0

似乎共识是 AlarmManager.set() 的文档以及声称 Intents(不仅仅是包装 PendingIntents)的其他 AlarmManager 方法进行比较,以检查是否已经设置了特定警报。

不要依赖 AlarmManager 匹配 Intent,而是依赖 PendingIntent 的匹配,这似乎像宣传的那样工作。

于 2011-11-01T14:32:26.647 回答