从AlarmManager中删除闹钟时,我是否应该同时取消PendingIntent?

3

我试图从AlarmManager中删除闹钟。我刚刚调用了AlarmManager.cancel(),看起来它运行正常。那我是否也应该取消PendingIntent,为什么?

PendingIntent p; // prepare a pending intent which matches target alarm's intent.
alarmManager.cancel(p);
p.cancel() // should I do that? 
2个回答

1
不要在设置闹钟时使用FLAG_CANCEL_CURRENT与PendingIntents。如果您想将闹钟重新安排到不同的时间,则根本不需要任何标志;只需使用零标志创建重复的PendingIntent,然后使用它来设置()闹钟:这将隐式取消现有闹钟,然后将其设置为新指定的时间。但是,如果您在创建新PendingIntent时使用了FLAG_CANCEL_CURRENT,则会破坏Alarm Manager识别它与现在已取消的PendingIntent“相同”的能力,从而导致旧的PendingIntent挂起,无法传递,占用内存和CPU。我曾经看到过有这个错误的应用程序在系统中累积了数百个陈旧的闹钟,足以对性能和内存使用造成明显影响。
如果您只想更改extras而不实际重新安排现有闹钟,则可以使用FLAG_UPDATE_CURRENT。如果您想重新安排或取消现有闹钟,请根本不使用任何标志。

0

这并非必须做的,但这取决于你的使用方式。

PendingIntent 本身只是一个由系统维护的令牌引用,描述用于检索它的原始数据。这意味着,即使所属应用程序的进程被杀死,其他已获得该 PendingIntent 的进程仍然可以使用它。如果创建应用程序稍后重新检索相同类型的 PendingIntent(相同的操作、相同的 Intent 操作、数据、类别和组件以及相同的标志),则它将接收到代表相同令牌的 PendingIntent,如果该令牌仍然有效,则可以调用 cancel() 来删除它。

如果您只需要在任何您使用的 Intent 中同时激活一个 PendingIntent,则可以使用标志 FLAG_CANCEL_CURRENT 或 FLAG_UPDATE_CURRENT,来取消或修改与您提供的 Intent 关联的当前 PendingIntent。


谢谢您的建议。我试着使用 PendingIntent.cancel() 来测试我的 AlarmManager 处理程序类。参见链接 https://dev59.com/mm455IYBdhLWcg3wD_6Z#9575569 。但是,适当调用 PendingIntent.cancel() 并进行测试太麻烦了。所以我决定停止。 - tomohiko sato
请将上面的回复视为此问题的被采纳答案,这将关闭问题,并允许 Stack Overflow 社区成员专注于未解决的问题! - apelsoczi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接