如何通过 PendingIntent 将数据发送到广播?

21

我正在尝试通过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.... 
}

我看到BroadcastonReceive()被调用了-这意味着Broadcast已经以正确的方式注册,但是extras仍然为空。

有什么想法吗?


我在这里做过类似的事情!!!https://dev59.com/G23Xa4cB1Zd3GeqPicf0#14612215 - Etienne Lawlor
3个回答

45

将数据放入您在待定意图中使用的意图中作为额外内容。 您将在BroadCast接收器的onReceive方法中获取此意图。 请尝试按以下方式定义待定意图。

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

1
先生,您为我节省了几个调试小时。谢谢! - prgDevelop
你救了我的一天,但这听起来很奇怪,getBroadcast。 - Marian Pavel
即使我们的应用程序关闭,这个对象在广播接收器中是否会持续存在? - user2603796
@FarazAhmad 是的,它会持久存在。 - Mr.India
感谢使用 'PendingIntent.FLAG_CANCEL_CURRENT'。 - div

11

待定意图所述:

由于这种行为,了解两个意图在检索PendingIntent时被视为相同非常重要。人们经常犯的一个错误是使用仅在其“extra”内容上有所不同的意图创建多个PendingIntent对象,期望每次都会得到不同的PendingIntent,但实际上并不会发生。用于匹配的意图部分是由Intent.filterEquals定义的相同部分。如果您使用两个与Intent.filterEquals相等的意图对象,则将为它们同时获得相同的PendingIntent。
处理此问题通常有两种方法。
如果您确实需要同时使用多个不同的PendingIntent对象(例如用作同时显示的两个通知),则需要确保它们之间存在某些不同之处,以将它们与不同的PendingIntents相关联。这可以是Intent.filterEquals考虑的任何意图属性,或者提供给getActivity(Context, int, Intent, int), getActivities(Context, int, Intent[], int), getBroadcast(Context, int, Intent, int)getService(Context, int, Intent, int)的不同请求代码整数。
如果您只需要一个时间内激活的PendingIntent对象,而且对于您将使用的任何意图,您只需要一个时间内激活的PendingIntent对象,则可以使用标志FLAG_CANCEL_CURRENTFLAG_UPDATE_CURRENT,以取消或修改与您提供的意图相关联的当前PendingIntent。

0

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

您应该使用FLAG_MUTABLE

这里是一个例子:

PendingIntent.getBroadcast(
     context,
     0,
     intent,
     PendingIntent.FLAG_MUTABLE //not FLAG_IMMUTABLE
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接