如何创建不同的pendingintent使filterEquals()返回false?

mar*_*bse 20 android repeat alarmmanager android-pendingintent

我正在使用AlarmManager设置重复意图,但它已经造成一些小问题,所以希望任何人都可以提供帮助.

摘要

有2个未决意图.一个运行在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); 
Run Code Online (Sandbox Code Playgroud)

删除:

问题是我们需要删除其中一个.删除待处理意图的正确方法是设置相同的意图,然后从AlarmManager调用cancel.

Android文档:

public void cancel(PendingIntent operation)
删除具有匹配Intent的所有警报.任何类型的警报,其Intent与此匹配的警报(由filterEquals(Intent)定义)将被取消.

public boolean filterEquals(Intent other)
确定两个意图是否相同以进行意图解析(过滤).也就是说,如果他们的行为,数据,类型,类别和类别是相同的.这不会比较意图中包含的任何额外数据.

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

这有什么解决方法吗?

小智 23

您可以在创建待定意图时尝试使用requestCode参数:

PendingIntent pi =PendingIntent.getBroadcast(mContext, yourUniqueDatabaseId,i,PendingIntent.FLAG_ONE_SHOT);
Run Code Online (Sandbox Code Playgroud)

这应该创建一个独特的Intent用于匹配目的.