AlarmManager.set(...)行为与文档不匹配。难道我做错了什么?

时间:2011-10-31 18:31:09

标签: android alarmmanager alarms

我正在使用此代码设置闹钟

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

按预期行事,删除任何已设置的警报,并将其替换为新警报。

3 个答案:

答案 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的匹配,这似乎与宣传的一样。