如何通过PendingIntent发送数据到Broadcast?

问题描述 投票:0回答:3

我正在尝试通过

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
3个回答
44
投票

将您正在使用的意图中的数据作为附加项放入待定意图中。 您将在

onReceive
接收器的
BroadCast
方法中获得此意图。 尝试如下定义待定意图。

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

11
投票

未决意向所述:

由于这种行为,为了检索 PendingIntent,了解何时两个 Intent 被认为是相同的很重要。人们常犯的一个错误是创建多个 PendingIntent 对象,其 Intents 仅在其“额外”内容上有所不同,并期望每次都获得不同的 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_CURRENT
FLAG_UPDATE_CURRENT
取消或修改 无论当前 PendingIntent 与您的 Intent 相关联 供应。


0
投票

任何在广播接收器中遇到空附加的人:

你应该使用

FLAG_MUTABLE

举个例子:

PendingIntent.getBroadcast(
     context,
     0,
     intent,
     PendingIntent.FLAG_MUTABLE //not FLAG_IMMUTABLE
)
© www.soinside.com 2019 - 2024. All rights reserved.