我正在尝试通过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
以正确的方式注册了,但是extras仍然是空的。
有什么想法吗?
3条答案
按热度按时间7dl7o3gd1#
将您正在挂起Intent中使用的Intent中的数据作为Extras放入。您将在
BroadCast
接收器的onReceive
方法中获得此Intent。请尝试按如下方式定义挂起Intent。yzxexxkh2#
如pending intent上所述:
由于此行为,了解何时两个Intent被视为相同以便检索PendingIntent是很重要的。人们常犯的一个错误是创建多个PendingIntent对象,其Intent仅在其“额外”内容中变化。期望每次都获得不同的PendingIntent。这 * 不会 * 发生。用于匹配的Intent部分与
Intent.filterEquals
定义的Intent部分相同。如果您使用两个根据Intent.filterEquals
等效的Intent对象,则它们将获得相同的PendingIntent。有两种典型的方法来处理这个问题。
如果您确实需要同时激活多个不同的PendingIntent对象(例如用作同时显示的两个通知),那么您需要确保它们有一些不同之处,以便将它们与不同的PendingIntents相关联。这可能是
Intent.filterEquals
考虑的任何Intent属性,或者提供给getActivity(Context, int, Intent, int)
、getActivities(Context, int, Intent\[\], int)
、getBroadcast(Context, int, Intent, int)
或getService(Context, int, Intent, int)
的元素。如果对于您要使用的任何Intent,一次只需要一个活动的PendingIntent,则您也可以使用标志
FLAG_CANCEL_CURRENT
或FLAG_UPDATE_CURRENT
来取消或修改与您提供的Intent关联的任何当前PendingIntent。whlutmcx3#
遇到Broadcast Receiver中获得空额外内容的任何人:
您应该使用
FLAG_MUTABLE
下面是一个例子: