使用AlarmManager取消特定的PendingIntent

时间:2012-03-09 15:16:16

标签: android android-intent alarmmanager android-pendingintent

我正在安排多个意图发送到BroadcastReceiver。 每个意图之间的区别在于它将被接收的时间和它包含的额外数据。

现在我需要允许用户取消特定的警报。根据AlarmManager.cancel()javadoc,它使用filterEquals方法比较意图:

http://developer.android.com/reference/android/content/Intent.html#filterEquals(android.content.Intent)

现在的问题是,根据filterEquals,我所有的意图都是一样的。方法检查“操作,数据,类型,类和类别”。

并且唯一数据要么是意图额外的捆绑,要么是在AlarmManager中的时间。 我尝试更改任何这些参数 - 例如使用:

intent.setData(Uri.withAppendedPath(Uri.EMPTY, "some_unique_data"));

根据filterEquals方法,这会使每个意图都是唯一的,但是在将Data更改为类似的东西后,我的意图不再到达BroadcastReceiver。

根据filterEquals,我可以更改哪些特定的数据以使每个intent都是唯一的,并且仍然可以接收到我的简单BroadcastReceiver?

也许我可以用任何方式修改我的接收器?

2 个答案:

答案 0 :(得分:3)

好的,所以我明白了。因为我的每个警报都有唯一的时间和对象ID,所以这就是我创建PendingIntent的方式:

return PendingIntent.getBroadcast(context, time*100000+o.getId(), toFire, 0);

现在时间是24或15(事件发生之前24小时或发出警报之前15分钟)并且警报数据对象包含唯一ID。所以我添加了两个并在getBroadcast中将其指定为“requestCode”参数。这足以基于相同的数据做出独特的意图。 希望这可以帮助任何有同样问题的人!

答案 1 :(得分:1)

我的应用程序遇到了类似的问题。 在我的应用程序中,我使用SQLite DB存储有关每个警报的详细信息以及唯一的ROW_ID。

因此,在我的报警列表视图中,每一行都有一个与之关联的相应ROW_ID。 如果用户单击特定行,我只是将此ROW_ID传递给执行删除操作的方法

现在,我的所有警报都是使用Intents创建的,其数据部分设置为:

Uri.parse(Constants.INTENT_PRE + ROW_ID);

所以为了删除它们,我创建了一个Intent,它在创建时使用了相同的数据(如上所述,以及唯一的ROW_ID)。

毋庸置疑,从“行动,数据,类型,类别和类别”来看,只有“数据”部分对于我现有的每个PendingIntents都是不同的。

希望这有帮助!