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

时间:2011-07-19 18:56:29

标签: android android-intent broadcastreceiver android-pendingintent

我正在尝试通过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以适当的方式注册,但仍有额外内容为空。

有什么想法吗?

2 个答案:

答案 0 :(得分:37)

将您正在使用的意图中的数据作为Extras放置。 您将在onReceive BroadCast接收方法中获得此意图。 尝试定义Pending意图如下。

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

答案 1 :(得分:11)

pending intent所说:

  

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

     

有两种典型的方法可以解决这个问题。

     

如果您确实需要多个不同的PendingIntent对象,请执行此操作   同时(例如使用两个显示的通知   在同一时间),那么你需要确保有一些东西   将他们与不同的人联系起来是不同的   PendingIntents。这可以是所考虑的任何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与您的意图相关联   供给。