20

我正在尝试通过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以正确的方式注册,但仍然是空的。

有任何想法吗?

4

2 回答 2

42

将数据放入您在待定意图中使用的意图中作为附加。您将在接收者的onReceive方法中获得此意图。BroadCast尝试如下定义待定意图。

PendingIntent sentPI = PendingIntent.getBroadcast(activity, 0, intent,PendingIntent.FLAG_CANCEL_CURRENT);
于 2011-07-19T18:58:57.787 回答
11

如未决意图所述:

由于这种行为,重要的是要知道两个 Intent 何时被认为是相同的,以便检索 PendingIntent。人们犯的一个常见错误是创建多个 PendingIntent 对象,其 Intent 仅在其“额外”内容上有所不同,期望每次都获得不同的 PendingIntent。这不会发生。Intent 中用于匹配的部分与定义的部分相同Intent.filterEquals。如果您使用两个与 per 等效的 Intent 对象Intent.filterEquals,那么您将获得相同的 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 用于您将使用的任何 Intent,那么您可以选择使用标志 FLAG_CANCEL_CURRENTFLAG_UPDATE_CURRENT取消或修改与您提供的 Intent 关联的任何当前 PendingIntent。

于 2014-01-04T13:12:35.057 回答