5

我已经安排了一个PendingIntentwith 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?

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

我该怎么做呢?

我有过和/或尝试过的几个想法。一个围绕Intent.fillIn()函数展开,我是否可以使用它来指示它应该(或不应该)覆盖附加内容,以便我可以检索原始内容。

再看远一点,我看到PendingIntentwriteToParcel()。我可以使用它来访问附件的附加功能Intent吗?我的尝试readBundle: bad magic number在 readParcel 上失败,但出现异常:

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

我怀疑这可能是因为我正在输出 aPendingIntent但试图将其作为Intent.

另一个想法是我可以调用 send()PendingIntent以使其立即交付,并传递一个Intent带有新键的新键来添加。然后在处理程序中,我必须遍历意图附加项中的所有键。PendingIntent然后,AlarmManager如果还没有时间进行实际处理,则需要重新发出。

4

2 回答 2

4

尝试这个

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

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

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

于 2013-04-15T06:31:41.730 回答
3

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

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

此外,附加项包含名称/值对,重要的是添加的新键与现有的键不匹配Intent。这意味着removeExtra()必须在完成时调用它以在下次之前摆脱密钥。然后调用自己send()PendingIntent目标,然后当接收到意图时,可以访问新的和旧的额外内容。然后可以将这两个额外的内容收集到一个新Intent的中,然后AlarmManager可以调用它来重新安排。

于 2013-04-28T16:59:28.707 回答