Как отправить данные через PendingIntent в Broadcast? - PullRequest
16 голосов
/ 19 июля 2011

Я пытаюсь отправить через 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 ]

37 голосов
/ 19 июля 2011

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

PendingIntent sentPI = PendingIntent.getBroadcast(activity, 0, intent,PendingIntent.FLAG_CANCEL_CURRENT);
11 голосов
/ 04 января 2014

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

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

...