Является ли использование registerReceiver в классе приложения понятным хорошей, известной практикой?

Фон

В Android есть 2 возможных способа прослушивания системных событий через BroadcastReceivers:

  • статически, через манифест
  • программно, используя код.

Так как некоторые проекты содержат множество видов деятельности, сервисов и "менеджеров", может быть полезно иметь один BroadcastReceiver, который будет уведомлять всех своих слушателей о том, что произошло, вместо того, чтобы иметь несколько BroadcastReceivers (и их обработки кода).

Примером такого BroadcastReceiver является тот, который слушает изменения связи:

@Override
public void onCreate() {
    super.onCreate();
            ...
    registerReceiver(new ConnectivityChangedBroadcastReceiver(), new IntentFilter(
            ConnectivityManager.CONNECTIVITY_ACTION));
            ...
    }

Вопрос

Цель состоит в том, чтобы прослушивать события, пока приложение "живое" (через службы и/или действия).

Использование манифеста пропустит эту цель, так как оно пробудит приложение каждый раз, когда произойдет событие, даже если приложение не нуждается в нем.

Дело в том, что отмена регистрации не происходит, и, возможно, это приводит к тому, что ОС обрабатывает приложение по-другому из-за этого.

Имеет ли вызов "registerReceiver" в классе, который выходит из приложения, является хорошей известной практикой?

Есть ли у него какие-либо побочные эффекты и вещи, которые нужно знать при использовании?

Есть ли альтернатива этому?

Я просто хочу быть уверенным, что он считается безопасным для использования.

Ответ 1

мы не можем действительно знать, что хорошо или лучше для вас.

Я советую вам узнать больше о различии между способами регистрации получателя:

1/в выражении : обработчик получателя будет запускаться каждый раз, когда произойдет соответствующее событие. Пример: посланник facebook обедает каждый раз, когда у вас есть подключение к Интернету, чтобы показать вам ваши уведомления... или другие приложения отправляются на обед при подключении к предлагаемым обновлениям... другими словами, приемник всегда зарегистрирован.

2/в службе или деятельности или приложении: приемник будет незарегистрирован, когда будет уничтожен контекст того, где он зарегистрирован. другими словами, он полностью зависит от контекста, в котором он зарегистрирован, и вы обязаны отменить его где-нибудь в коде. Например: одна активность ожидает, что служба (которая делает что-то в фоновом режиме) отправляет предупреждение для обновления, затем вы можете зарегистрировать приемник в своем onResume() и отменить его в своем onPause().

Заключение: это зависит только от требований жизненного цикла получателя.

см. также Регистрация ретранслятора широковещательной передачи в манифесте против активности

Основное различие между Manifest и Programmatic регистрации BroadcastReceiver