首页 文章

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

提问于
浏览
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的警报(等于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 回答

  • 0

    也许是因为你给每个警报一个不同的ID( alert.getID() 是否给出不同的ID?) . 通过文档,它很重要,但你仍然应该尝试 .

    如果它也不起作用,请保留上次设置警报的参考,当您需要取消它时,请自行取消,然后设置下一个警报 .

  • 0

    你试过PendingIntent标志: PendingIntent.FLAG_UPDATE_CURRENT intead of PendingIntent.FLAG_ONE_SHOT

  • 0

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

    不要依赖于AlarmManager匹配的Intents,而是依赖于PendingIntents的匹配,这似乎与宣传的一样 .

相关问题