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

Android AlarmManager.set(…)行为与文档不匹配。我做错什么了吗?,android,alarmmanager,alarms,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 = Pe

我正在用这个代码设置警报

//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);
但是我看到的行为与我应该在文件中看到的不匹配

公共无效集(int类型、长触发时间、挂起操作) 如果已经有一个报警计划用于相同的目的,则首先将其取消…如果已经有一个报警计划用于此目的(两个目的相等由filterEquals(目的)定义),则将其删除并替换为此目的

这表明,对于已经发出警报的意图,调用集(int类型、long triggettime、pendingent操作)应该替换该意图的旧警报。我没有看到任何警报被解除。相反,我设置的每个警报都会触发,尽管挂起的意图触发的意图都应该匹配(通过filterEquals(intent)),因为我对每个意图设置的都是相同的操作

我是否做错了什么,或者API的行为是否与文档中描述的不一样

注意:将PendingEvent实例化更改为

PendingIntent pendIntent = PendingIntent.getBroadcast(
getApplicationContext(), CONSTANT_ID,
intent, PendingIntent.FLAG_ONE_SHOT);

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

可能是因为您为每个报警提供了不同的ID(alert.getID()是否提供了不同的ID?)。根据文档,它不应该有什么问题,但是你还是应该尝试一下


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

您是否尝试过PendingEvent flag:
PendingEvent.flag\u UPDATE\u CURRENT
intead of
PendingEvent.flag\u one\u SHOT

大家似乎一致认为AlarmManager.set()的文档以及其他AlarmManager方法都声称(不仅仅是包装悬挂物)进行比较,以检查是否已设置特定警报


不要依赖AlarmManager的匹配意图,而应该依赖PendingEvents的匹配,它看起来像广告中所宣传的那样工作。

可能就是这样。这很重要。不同的ID意味着技术上不同的意图。这实际上是我在寻找的功能,但它与我从文档中所期望的功能不匹配o这让我怀疑我的理解在某个地方有缺陷。我在文档引用中添加了另一句话,表明重复使用相同意图的概念(PendingEvents)我的问题是AlarmManager是查看PendingEvent生成的意图,还是只查看PendingEvent的唯一性文档说它通过filterEquals计算意图。filterEquals与PendingEvent无关,所以我不确定这是否重要。但他应该测试我t、 尽量保留对上次设置的报警的引用,以便在需要时取消报警。我猜文档中有问题。我发现AudioManager的文档“有点”错误,但我通过保留对AudioManager的静态引用成功修复了此问题。请尝试保留对您的AlarmManager的静态引用。我在我的一个应用程序中保留对AlarmManager的静态引用,它会毫无问题地取消匹配意图。请尝试清除
alarm.getID()
并使用
0
。请参阅下面我对jong答案的评论。我想我们永远不会知道