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

2wnc66cl  于 2023-03-06  发布在  Android
关注(0)|答案(3)|浏览(295)

我正在尝试通过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仍然是空的。
有什么想法吗?

7dl7o3gd

7dl7o3gd1#

将您正在挂起Intent中使用的Intent中的数据作为Extras放入。您将在BroadCast接收器的onReceive方法中获得此Intent。请尝试按如下方式定义挂起Intent。

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

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_CURRENTFLAG_UPDATE_CURRENT来取消或修改与您提供的Intent关联的任何当前PendingIntent。

whlutmcx

whlutmcx3#

遇到Broadcast Receiver中获得空额外内容的任何人:

您应该使用FLAG_MUTABLE
下面是一个例子:

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

相关问题