【问题标题】:How can I get the Intent extras for a PendingIntent that is already pending?我怎样才能获得已经挂起的 PendingIntent 的 Intent 附加功能?
【发布时间】:2013-04-14 20:30:54
【问题描述】:

我已经安排了PendingIntentAlarmManager。当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() 函数展开,我是否可以使用它来指示它应该(或不应该)覆盖额外的,以便我可以检索原始的。

再看一点,我看到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 并添加一个新密钥。然后在处理程序中,我必须遍历意图附加项中的所有键。如果尚未进行实际处理,则需要将PendingIntent 重新发送到AlarmManager

【问题讨论】:

    标签: android android-pendingintent


    【解决方案1】:

    试试这个

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

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

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

    【讨论】:

    • 不走运。意图中的额外内容仍然为空。我怀疑,通过阅读文档,正在发生的事情是 PendingIntent 函数没有返回传递的 Intent 中的任何数据,它们只是在获取它。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-04-02
      • 2017-05-25
      • 2011-06-04
      • 2021-09-27
      • 1970-01-01
      • 2023-01-22
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多