如何创build不同的pendingintent所以filterEquals()返回false?

我使用AlarmManager来设置重复的意图,但它已经造成了一些小麻烦,所以希望任何人都可以帮忙。

概要

有两个待定的意图。 一个运行在1000,另一个运行在2000,每天。 每个数据库都包含一个来自数据库的行ID,用于标识。 代码看起来像这样:

Intent i = new Intent(mContext, ScheduleReceiver.class); i.putExtra(RuleDBAdapter.KEY_ROWID, (int)taskId); PendingIntent pi =PendingIntent.getBroadcast(...); mAlarmManager.set(AlarmManager.RTC_WAKEUP, when.getTimeInMillis(), pi); 

删除:

问题是我们需要删除其中的一个。 删除挂起的意图的正确方法是设置一个相同的,然后从AlarmManager中调用取消。

Android文档:

public void cancel(PendingIntent操作)
使用匹配的意图删除任何警报。 任何types的意图匹配此警报(由filterEquals(Intent)定义)的警报将被取消。

公共布尔filterEquals(意图其他)
确定两个意图是否相同意图解决(过滤)的目的。 也就是说,如果他们的行为,数据,types,类别和类别是相同的。 这并不比较意图中包含的任何额外数据

所以在上面的例子中,如果我做了一个相同的意图然后取消, 上述两个意图将被取消,因为它们来自相同的类/相同的行动等(除了“额外”的数据rowId,但filterEquals不在乎关于额外的数据)。

有没有解决方法?

Solutions Collecting From Web of "如何创build不同的pendingintent所以filterEquals()返回false?"

创build待定意图时,可以尝试使用requestCode参数:

 PendingIntent pi =PendingIntent.getBroadcast(mContext, yourUniqueDatabaseId,i,PendingIntent.FLAG_ONE_SHOT); 

这应该创build一个唯一匹配目的的意图。

public boolean filterEquals(Intent other)比较动作,数据,types,包,组件和类别,但不要比较额外的,所以extras之间的区别不能区分Intents。 尝试为这些意图设置不同的数据,数据可能是微不足道的Uris。

尝试阅读源代码以获取更多信息。

试图在意图中进行虚假行为。 例如。

 myIntent.setAction(""+System.currentTimeMillis()); 

这将导致filterEquals返回false。

我需要一个类似的解决scheme来发送来自多个号码的短信通知,以便允许通知以不同的号码启动短信线程查看器。

将任务ID和时间戳放入意图的操作中。 这样,您将挂起的意图与任务ID相关联,并且意图在过滤方面仍将不同。

 intent.setAction("ACTION_" + taskId + "_" + currentTimestamp); 

在我的情况下,我没有一个好方法来为我的未决意图生成唯一的密钥,所以我所做的是将自定义数据添加到生成的意图。

一旦你开始填充数据属性,你必须记得添加一个数据参数到Android清单中的意图filter。 如果你不这样做,它不会触发你的自定义接收器。

例子:

意图

  Intent intent = new Intent(reminderFire); intent.addCategory(reminderCategory); Uri.Builder builder = new Uri.Builder(); builder.scheme(context.getString(R.string.scheme)); builder.authority(context.getString(R.string.intent_filter_reminder_host)); builder.appendQueryParameter("oid", Reminder.getOid()); intent.setData(builder.build()); 

AndroidManifest条目

 <receiver android:name=".client.MyReminder" android:enabled="true" > <intent-filter> <action android:name="com.example.client.reminder.fire"/> <action android:name="com.example.client.reminder.category"/> <data android:host="@string/intent_filter_reminder_host" android:scheme="@string/scheme" /> </intent-filter> </receiver> 

通过这样做,您还可以在意图添加之前testing意图中的唯一性,如果您是unit testing,则这是有用的。