Как отправлять данные через 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 зарегистрирован соответствующим образом, но все же дополнительные функции пустые.

Любые идеи?

Ответ 1

Поместите данные в намерения, которые вы используете в ожидании намерения как дополнительные. Вы получите это намерение в onReceive методе приемника BroadCast. Попробуйте определить ожидающие намерения, как показано ниже.

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

Ответ 2

как сказано в ожидающее намерения:

Из-за этого поведения важно знать, когда два намерения считаются одинаковыми для целей получения PendingIntent. Обычная ошибка, которую делают люди, заключается в создании нескольких объектов PendingIntent с Intents, которые изменяются только в их "лишнем" содержимом, ожидая, что каждый раз будет получать другой PendingIntent. Этого не происходит. Части намерения, которые используются для сопоставления, являются теми же, что определены Intent.filterEquals. Если вы используете два объекта Intent, которые эквивалентны по Intent.filterEquals, вы получите тот же 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 связан с намерением, которым вы являетесь поставки.