2011-09-21 11 views
20

我使用AlarmManager来设置重复的意图,但它已经造成了一些小麻烦,所以希望任何人都可以提供帮助。如何创建不同的pendingintent所以filterEquals()返回false?

摘要

有2个未决意图。一个运行在1000,另一个运行在2000,每天。每个数据库都包含来自数据库的行标识以用于标识。该代码看起来是这样的:

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 operation)
具有匹配的意图删除任何警报。任何类型的意图与其匹配的警报(由filterEquals(Intent)定义)将被取消。

public boolean filterEquals (Intent other)
确定是否两个目的是意图分辨率(滤波)的目的是相同的。也就是说,如果他们的行为,数据,类型,类别和类别相同。此不会比较意图中包含的任何额外数据

所以在上面的例子,如果我做相同的意图再取消,上述两种意图将被取消,因为他们是来自同一个类/同样的动作等(除了“额外”数据是rowId,但filterEquals不关心额外的数据)。

有没有解决方法?

回答

23

创建挂起的意图时,您可以尝试使用requestCode参数:

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

这应该创建一个Intent是进行匹配独特..

+0

谢谢!它会工作。不知道这很简单。 :) – markbse

+0

我希望他们会更新文档,因为当你试图让某些东西工作时,它说requestCode的“未使用”真的很吓人。 –

+0

小心:requestCode被定义为int,而通常(sqlite)行ID很长。 – HaimS

2

公共布尔filterEquals(意向等)比较动作,数据,类型,包,组件和类别,但不会比较额外的内容,因此extras之间的差异无法区分Intents。尝试为这些意图设置不同的数据,数据可能是微不足道的Uris。

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

1

尝试在意图中放置一个虚拟动作。例如,

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

这将导致filterEquals返回false。

我需要一个类似的解决方案来发送来自多个号码的短消息通知, 为了允许通知以不同的数字启动短信线程查看器。

+0

做这个甚至工作? –

0

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

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

在我来说,我没有产生的待处理的意图的唯一密钥的好方法所以我所做的就是自定义的数据添加到生成的意图。

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

例子:

意图

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> 

通过这样做,你也可以测试在意向独特性前将其添加为待的意图,这是有用的如果你是单元测试。