我正在尝试通过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
以适当的方式注册,但仍有额外内容为空。
有什么想法吗?
答案 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_CURRENT
或FLAG_UPDATE_CURRENT
取消或修改 无论当前的PendingIntent与您的意图相关联 供给。