Почему получатель, определенный в манифесте, не получает широковещательные сообщения при использовании с LocalBroadcastManager?

Несколько дней назад я прочитал, что есть лучший механизм для отправки широковещательных сообщений в рамках одного приложения — LocalBroadcastManager.

Он работает хорошо (так же, как стандартные трансляции ..). Однако вчера я обнаружил, что он не может отправлять широковещательные сообщения получателям, которые определены в манифесте (когда я временно переключил его на использование стандартного метода Activity sendBroadcast, он сработал).

Причина, по которой я хочу этого (и поправьте меня, если есть более предпочтительный способ сделать это):

Допустим, я хочу скачать файл. Я воспользуюсь услугой, потому что так хочет Android. Хорошо, теперь я хочу отображать (и периодически обновлять) свой прогресс в своей деятельности. Таким образом, служба будет отправлять трансляции в мою активность, и активность должна зарегистрироваться для их получения. Предпочтительный способ обработки широковещательных сообщений — зарегистрироваться в onResume() и отменить регистрацию в onPause(). Теперь давайте представим, что пользователю наскучил медленно движущийся индикатор прогресса, поэтому он нажимает «Домой» и уходит заниматься чем-то другим. Позже он возвращается и хочет видеть текущий статус загрузки, но как я могу сказать ему, когда я отписался от трансляций в ту секунду, когда он оставил мою заявку?

Вот почему я использую приемник, определенный в манифесте, чтобы быть всегда готовым к приему трансляции и постоянному ее хранению (общие настройки, база данных...), чтобы активность могла реконструировать последнюю трансляцию, когда она становится видимой.

Однако теперь я не уверен, то ли эта процедура не рекомендуется, то ли почему LocalBroadcastManager не позволяет мне это делать.




Ответы (1)


Если вы используете SharedPreferences, обходным путем будет реализация вашей активности OnSharedPreferenceChangeListener< /а>. Таким образом, служба записывает pref, а активность прослушивает изменения и обновляет индикатор выполнения. onResume() вы также проверяете настройки и соответствующим образом обновляете пользовательский интерфейс.

Хорошая вещь в этом заключается в том, что у вас действительно нет утечки, если вы не сможете отменить их регистрацию - см. -defined-registered">Android: где должен быть определен/зарегистрирован OnSharedPreferenceChangeListener - я предпочитаю отменить регистрацию на onDestroy(), так как хочу, чтобы моя активность обновлялась, даже если она не на переднем плане, - и слушатель уйдет, даже если onDestroy не вызывается.

Что касается того, почему это не работает с манифестными зарегистрированными получателями - не могли бы вы опубликовать какой-нибудь код? Вы действительно регистрируете приемники в LBM?

person Mr_and_Mrs_D    schedule 24.12.2013