我已安排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()
函数,我可以使用它来表明它应该(或不应该)覆盖额外的东西,以便我可以检索原始的。
进一步了解,我发现PendingIntent
有writeToParcel()
。我可以使用它来访问附加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
。
答案 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
来重新安排。