如何获取已挂起的PendingIntent的Intent附加内容?

时间:2013-04-14 20:30:54

标签: android android-pendingintent

我已安排PendingIntent AlarmManager。当AlarmManager发送Intent时,我可以getExtras()我最初发送的所有数据。

但是,有时我会在Intent触发之前获得我希望通过AlarmManager传递的其他数据。我的想法是,我会得到Intent,就像我要取消它一样,但是在取消它之后,更新附加内容并使用AlarmManager重新安排它,如下所示:

Intent i=new Intent(this, MyReceiver.class);
Bundle b = i.getExtras();
PendingIntent pi=PendingIntent.getBroadcast(this, id,i, 0);
if (b == null) b = i.getExtras(); // in case I can't get it before calling getBroadcast
// now add a key to b, put it in a new intent, schedule it, and cancel the old one?

我正在使用与我之前安排的相同ID调用getBroadcast()。唯一的问题是,当我调用getExtras()时,它总是返回null。这似乎与我经常看到的问题相反,Intent将被缓存,这是不可取的。在这种情况下,我实际上想要获取缓存的Intent并获取它的值,并且由于Intent处于待处理状态,它应该仍然存在。

我该怎么做?

我已经和/或尝试过的一些想法。一个围绕Intent.fillIn()函数,我可以使用它来表明它应该(或不应该)覆盖额外的东西,以便我可以检索原始的。

进一步了解,我发现PendingIntentwriteToParcel()。我可以使用它来访问附加Intent的附加内容吗?我的尝试因readParcel上的readBundle: bad magic number异常而失败:

PendingIntent pi=PendingIntent.getBroadcast(this, id,i, 0);
Parcel out = Parcel.obtain();
pi.writeToParcel(out, 0);
i.readFromParcel(out);

我怀疑这可能是因为我输出了PendingIntent但是试图将其作为Intent读回来。

另一个想法是我可以在PendingIntent上调用send()以使其立即传递,传递一个新的Intent并添加一个新密钥。然后在处理程序中,我将不得不遍历intent的额外内容中的所有键。如果还没有时间进行实际处理,则需要将PendingIntent重新发布到AlarmManager

2 个答案:

答案 0 :(得分:4)

试试这个

pi = PendingIntent.getBroadcast(this, id, i, 
                       PendingIntent.FLAG_UPDATE_CURRENT)

这里我们发送 PendingIntent.FLAG_UPDATE_CURRENT 意图标志,如果存在相同的PendingIntent,它将按原样返回,否则将返回一个新的PendingIntent。

请注意,当我们说意图匹配时,URI,数据类型,类别将匹配,而匹配时将忽略意图附加。换句话说, IntentFilters 将与两个意图相匹配。

答案 1 :(得分:3)

好的,我终于找到了解决这个问题的方法。

似乎无法从Intent获取PendingIntent,但可以在传递给Intent的{​​{1}}中添加额外内容 - 它重要的是最后一个参数,标志为零,这样它就不会覆盖现有的额外参数。

此外,附加内容包含名称/值对,并且添加的新密钥与现有getBroadcast()中的密钥不匹配非常重要。这意味着在完成下一次之前删除密钥时必须调用Intent。然后在removeExtra()上定位自己的send(),然后在收到意图时,可以同时访问新的和旧的附加内容。然后可以将这两个附加内容收集到一个新的PendingIntent中,然后调用Intent来重新安排。