从AlarmManager删除警报时,是否还要取消PendingIntent?

时间:2016-05-12 02:24:51

标签: android alarmmanager android-pendingintent

我试图从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 个答案:

答案 0 :(得分:1)

永远不要将FLAG_CANCEL_CURRENT与您在设置闹钟时使用的PendingIntents一起使用。如果你想在不同的时间重新安排闹钟,你根本不需要任何旗帜;只需创建一个标志为零的重复PendingIntent,然后使用它来设置()一个警报:这将隐式取消现有警报,然后将其设置为新指定的时间。但是,如果您在创建新的PendingIntent时使用了FLAG_CANCEL_CURRENT,则会破坏警报管理器识别它的相同"的能力。作为现在被取消的PendingIntent,你最终会挂着旧的,无法送达,占用内存和CPU。我已经看到有这个错误的应用程序在系统中存在数百个陈旧的警报,足以引起明显的性能和内存使用率。

如果您只想更改附加内容而不实际重新安排现有警报,那就是FLAG_UPDATE_CURRENT。如果您想重新安排或取消现有的闹钟,请不要使用任何标志。

答案 1 :(得分:0)

没有必要这样做。但这对你的使用很重要。

  

PendingIntent本身只是对由其维护的令牌的引用   系统描述用于检索它的原始数据。这个   意味着,即使它拥有的应用程序的进程被杀死了   PendingIntent本身将继续可用于其他进程   得到它。如果创建应用程序稍后重新检索相同的内容   一种PendingIntent(相同的操作,相同的Intent动作,数据,   它会收到一个类别和组件,以及相同的标志   PendingIntent表示相同的标记,如果它仍然有效,和   因此可以调用cancel()来删除它。

如果您一次只需要一个PendingIntent激活您将使用的任何Intent,那么您也可以使用标志public function import($file){ Artisan::call('lang:import',[$file]) ; return Redirect::back(); } axios.get('/user?ID=12345') .then(function (response) { console.log(response); }) .catch(function (response) { console.log(response); }); 取消或修改当前PendingIntent关联的任何内容与你提供的意图。