Передача аргументов BroadcastReceiver через намерение в Android


9

У меня есть приложение, которое устанавливает будильник с помощью AlarmManager, который запускает другое действие, когда он отключается. AlarmManager берет PendingIntent и порождает класс BroadcastReceiver, когда наступает указанное время. Мне интересно, есть ли способ передать аргументы этому BroadcastReceiver через объект Intent, который входит в PendingIntent?

В основном то, что я хотел бы сделать что-то вроде этого:

Intent my_intent = new Intent(this, BroadcastService.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, my_intent, 0); 
my_intent.putExtra("arg1", arg1); 
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (1000), pendingIntent); 

, и я хотел бы иметь возможность получить arg1 в (Context Намерение,) метод OnReceive в BroadcastReceiver в. Я понял, что локальная переменная my_intent будет вторым параметром, переданным onReceive на PendingIntent, но, видимо, это не совсем правильно. Можно ли таким образом передавать параметры между Activity и BroadcastReceiver (используя Intent.putExtra()), или я должен использовать ContentProvider вместо этого?

Спасибо!

Iva

1

У меня есть приложение, которое устанавливает в сигнала с помощью AlarmManager, который начинается другой вид деятельности, когда она уходит.

Это плохая форма. Не выставляйте такие действия без предупреждения, например, без . Хорошая причина (например, входящий телефонный звонок). Что делать, если пользователь находится в середине чего-то, например, TXTing или играет в игру или пытается набрать номера для меню телефона?

Можно ли передать параметры между активностью и BroadcastReceiver таким образом (с использованием Intent.putExtra())

Да. Однако имейте в виду, что вы захотите использовать PendingIntent.FLAG_UPDATE_CURRENT, когда вы создаете свой PendingIntent, чтобы убедиться, что все новые дополнения, которые вы поставляете по намерению, действительно используются.

  0

Ах да, я оговорился; Я использую Alarm в качестве проспекта для вызова определенного действия в определенное время, и когда будильник отключается, я создаю уведомление, которое пользователь может затем сбрасывать, когда это удобно, и только затем вызывает действие, так что я не «Не мешайте, что бы они ни делали. Спасибо за Ваш ответ! 14 янв. 102010-01-14 23:26:45

  0

Хмм, добавление PendingIntent.FLAG_UPDATE_CURRENT в качестве флага при получении PendingIntent, похоже, ничего не меняет; Я все еще не получаю дополнения от намерений в своей первоначальной Деятельности до намерения, переданного onReceive 15 янв. 102010-01-15 02:49:49

+1

Вы вызываете putExtra() перед созданием PendingIntent? Я не знаю, когда PendingIntent сериализует Intent, но если он сразу это сделает, вызовы putExtra() после создания PendingIntent не будут иметь никакого эффекта. 15 янв. 102010-01-15 03:15:29

  0

Я вызываю putExtra() после создания PendingIntent. Я заполняю все дополнительные функции внутри OnClickListener, и поэтому они могут быть не готовы, когда PendingIntent сначала создается. Возможно, мне лучше использовать ContentProvider. 15 янв. 102010-01-15 08:41:00

  0

Вы правы! Заполнение намерения перед его переносом в PendingIntent. Спасибо за вашу помощь! :) 15 янв. 102010-01-15 09:04:05


1

Да, я думаю, что можно передавать любые данные базового типа Java и Serializable/Parceable типов в статистов в намерению обернутых вокруг PendingIntent, а затем восстановить их с помощью Intent экземпляр передается в onReceive of Broadcastreceiver. Твой подход выглядит хорошо для меня.

В чем проблема/ошибка, которую вы получаете? Экземпляр «arg1» Serializable?

  0

Я не получаю сообщение об ошибке; Я просто не получаю пакет с намерением, который передается моему методу onReceive (Context, Intent) моего BroadcastReceiver; Я предполагаю, что намерение, переданное моему BroadcastReceiver, - это то же самое намерение, которое я создаю (и заполняю) в своей деятельности. В этом случае любой аргумент, который я хочу передать, действительно Serializable. 14 янв. 102010-01-14 23:22:23

  0

Можете ли вы показать нам свой код, который имеет/делает putExtra (..) и getXXXExtra (..)? 15 янв. 102010-01-15 03:20:37

+1

Оказывается, мне просто нужно положить putExtra (...) перед созданием PendingIntent. Спасибо за вашу помощь! 15 янв. 102010-01-15 09:08:22

  0

Собираетесь ли вы принять любой ответ или, по крайней мере, проголосовать за любого? 22 янв. 102010-01-22 03:22:18


9

У меня была аналогичная проблема, но я уже заполнял Intent сначала, прежде чем обернуть ее в PendingIntent. Но ответ на мою проблему был, как указано выше, мне нужно было использовать флаг PendingIntent.FLAG_UPDATE_CURRENT. Как только я установил флаг, он сработал! Надеюсь, это поможет другим. -Jeff

  0

У меня была эта же проблема, и флаг полностью сделал это. Благодаря! 10 ноя. 102010-11-10 03:03:04

  0

Вы спасатель жизни! 11 фев. 152015-02-11 23:27:36


5
int code=1; 
Intent i2 = new Intent(StartAlarm); 
i2.putExtra("_id",code); 

class test extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent arg1) { 
     int i=arg1.getIntExtra("_id",-1); 
    } 
}