【问题标题】:How to send data through PendingIntent to Broadcast?如何通过 PendingIntent 发送数据到广播?
【发布时间】:2011-10-08 19:32:32
【问题描述】:

我正在尝试通过PendingIntent 发送一些额外的数据,例如:

MyMessage message;
//...
Intent intent;
SmsManager sms = SmsManager.getDefault();
intent = new Intent(Constants.SENT_PLAIN);
intent.putExtra(Constants.EXTRA_RAW_ID, message.getId()); //putting long id (not -1L)
PendingIntent sentPI = PendingIntent.getBroadcast(activity, 0, intent, 0);
intent = new Intent(Constants.DELIVERED_PLAIN);
intent.putExtra(Constants.EXTRA_RAW_ID, message.getId());
PendingIntent deliveredPI = PendingIntent.getBroadcast(activity, 0, intent, 0);
sms.sendTextMessage(phoneNumber, null, message.getBody(), sentPI, deliveredPI);

然后在Broadcast 试图抓到数据:

@Override
public void onReceive(Context context, Intent intent) {
    String message, prefix = "";
    String action = intent.getAction();
    long id = intent.getLongExtra(Constants.EXTRA_RAW_ID, -1L);  //here I receive id=-1

    // blah-blah.... 
}

我看到Broadcast onReceive() 被调用了——这意味着Broadcast 以正确的方式注册,但仍然是空的。

有什么想法吗?

【问题讨论】:

标签: android android-intent broadcastreceiver android-pendingintent


【解决方案1】:

将您正在使用的意图中的数据放入待处理的意图中作为额外内容。 您将在BroadCast 接收器的onReceive 方法中获得此意图。 尝试如下定义待定意图。

PendingIntent sentPI = PendingIntent.getBroadcast(activity, 0, intent,PendingIntent.FLAG_CANCEL_CURRENT);

【讨论】:

  • 先生。你为我节省了几个小时的调试时间。谢谢!
  • 太棒了!非常感谢
  • 你拯救了我的一天,但听起来很奇怪,getBroadcast
  • 即使我们的应用关闭,这个对象是否会持续存在于广播接收器中?
  • @FarazAhmad 是的,它将持续存在。
【解决方案2】:

正如pending intent 所说:

由于这种行为,重要的是要知道两个 Intent 何时被认为是相同的,以便检索 PendingIntent。人们犯的一个常见错误是创建多个 PendingIntent 对象,其 Intent 仅在其“额外”内容上有所不同,期望每次都获得不同的 PendingIntent。这不会发生。 Intent 中用于匹配的部分与Intent.filterEquals 定义的部分相同。如果您使用两个根据Intent.filterEquals 等效的 Intent 对象,那么您将获得相同的 PendingIntent 对象。

有两种典型的处理方法。

如果您确实需要多个不同的 PendingIntent 对象在 同时(例如用作两个都显示的通知 同时),那么你需要确保有一些东西 他们的不同之处在于将它们与不同的 待定意图。这可能是考虑的任何 Intent 属性 Intent.filterEquals,或提供给的不同请求代码整数 getActivity(Context, int, Intent, int)getActivities(Context, int, Intent\[\], int)getBroadcast(Context, int, Intent, int)getService(Context, int, Intent, int).

如果您一次只需要一个激活的 PendingIntent 用于任何 您将使用的意图,然后您可以选择使用标志 FLAG_CANCEL_CURRENTFLAG_UPDATE_CURRENT 取消或修改 无论当前的 PendingIntent 与您的 Intent 相关联 供应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2011-10-10
    相关资源
    最近更新 更多