2

Я пытаюсь создать свое первое приложение для Android. Мне бы хотелось, чтобы основной поток (в моем случае: ActionBarActivity) получал уведомление о событии из фоновой активности (в моем случае: IntentService). Я читал, что использование трансляций должно быть лучшим способом сделать это.Избегайте регистрации дублирующих приемников вещания в Android

Чтобы зарегистрировать приемник вещания для прослушивания передач, посланных от фоновой активности, я использую следующий код внутри основного потока деятельности: метод

// Register broadcast receiver 
LocalBroadcastManager bManager = LocalBroadcastManager.getInstance(this); 
IntentFilter intentFilter = new IntentFilter(); 
intentFilter.addAction("com.me.myBroadcast"); 
bManager.registerReceiver(bReceiver, intentFilter); 

Я попытался положить это в OnCreate() мой основной поток, но я быстро обнаружил, что каждый раз, когда я перезапускаю действие (например, закрываю приложение и снова открываю его), он, похоже, создает «дублирующие» широковещательные приемники, которые затем запускают метод onReceive() раз, когда отправляется одна трансляция. Это вызывает проблемы.

Поэтому я создал файл SharedPreferences, чтобы сохранить логическое значение, которое запоминает, был ли я уже создан широковещательный приемник, чтобы избежать создания дубликатов. Это работает точно так же, как надеялись, до тех пор, пока я, конечно же, не перезагружу устройство, после чего Broadcast Receiver будет уничтожен, и приложение не создаст новый, потому что SharedPreferences boolean говорит, что он уже имеет его.

Я предполагаю, что смогу исправить эту проблему, настроив новый широковещательный приемник, чтобы прослушивать перезагрузку устройства, что сбрасывает логические параметры SharedPreferences, но у меня есть это ощущение, что я сильно расстраиваю вещи. Что мне не хватает? Спасибо за любую помощь!

+2

Не нужно помнить с sharedprefs. Просто зарегистрируйте приемник в onResume и отмените регистрацию приемника в onPause. ? – Kiran

+0

«Незарегистрированный приемник» был именно тем, что я искал, а также напоминанием использовать обратные вызовы onPause() и onResume() в этом контексте. Опубликуйте это как ответ, чтобы я мог дать вам за это кредит! – Eddie

ответ

2

Чтобы ответить на ваш вопрос, вы можете игнорировать sharedprefs и зарегистрировать широковещательный приемник в onResume и отменить регистрацию приемника в . Этот метод хорошо описан в отчете о состоянии работы (1) android doc. Обратите внимание, что таким образом вы получите обновления статуса, только если «Активность» находится на переднем плане. Используйте соответствующие методы жизненного цикла в зависимости от ваших потребностей.

Чтобы сообщить о состоянии на передних план деятельности от службы, мое предпочтение было бы ResultReceiver (2) класса, который чувствует себя естественно по сравнению с трансляцией. Кроме того, если вам нужно отправить несколько сообщений о статусе обратно, будет яснее с параметром statusCode в классе onReceiveResult класса ResultReceiver.

Смежные вопросы