【发布时间】:2013-04-14 20:30:54
【问题描述】:
我已经安排了PendingIntent 和AlarmManager。当AlarmManager 传递Intent 时,我能够getExtras() 我最初发送的所有数据。
但是,有时我会在AlarmManager 触发之前获得想要通过Intent 传递的其他数据。我的想法是,我会得到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() 函数展开,我是否可以使用它来指示它应该(或不应该)覆盖额外的,以便我可以检索原始的。
再看一点,我看到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 并添加一个新密钥。然后在处理程序中,我必须遍历意图附加项中的所有键。如果尚未进行实际处理,则需要将PendingIntent 重新发送到AlarmManager。
【问题讨论】:
标签: android android-pendingintent