Android – Когда регистрировать / отменить регистрацию широковещательных ресиверов, созданных в виде активности?

Мне нужно создать пользовательский широковещательный приемник в событии onCreate, и, очевидно, мне нужно отключить приемник вещания в событии onDestroy активности

Для ясности это фрагмент кода, который я использую

public class AnActivity extends Activity { private ResponseReceiver receiver; public class ResponseReceiver extends BroadcastReceiver { public static final String ACTION_RESP = "mypackagename.intent.action.MESSAGE_PROCESSED"; @Override public void onReceive(Context context, Intent intent) { // TODO Start a dialogue if message indicates successfully posted to server } } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); IntentFilter filter = new IntentFilter(ResponseReceiver.ACTION_RESP); filter.addCategory(Intent.CATEGORY_DEFAULT); receiver = new ResponseReceiver(); registerReceiver(receiver, filter); } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); } 

Я прочитал, что onPause / onResume и onStart / onStop события для активности также должны регистрировать и отменить регистрацию широковещательного приемника.

Я действительно хочу понять, что считается лучшей практикой для этого и почему.

Solutions Collecting From Web of "Android – Когда регистрировать / отменить регистрацию широковещательных ресиверов, созданных в виде активности?"

Вы должны зарегистрироваться и onStart() регистрацию своих приемников onStart() и onStop() .

Единственная причина, по которой Activity регистрирует BroadcastReceiver заключается в том, чтобы каким-то образом использовать события в текущей деятельности, чтобы информировать пользователя о событии. Если onStop() был вызван, то Activity больше не находится на переднем плане и поэтому не может обновить User.

Если вы хотите получать широковещательные события в фоновом режиме, вам следует рассмотреть возможность использования службы, как указано здесь .

Как говорит Константин, onDestroy() не гарантируется, что вы будете называться, и вы можете продолжать получать трансляции в течение длительного времени, когда Activity больше не открыта.

Поскольку onDestroy() не может быть вызван, вы должны использовать onPause() для onPause() регистрации. Рассмотрим жизненный цикл вашего широковещательного приемника: вам нужно, чтобы он был активным, только когда ваша деятельность находится на переднем плане? Затем используйте onResume() / onPause()

Android может убить ваше приложение с onStop() метода onStop() . Лучший способ решить эту ситуацию – зарегистрировать метод BroadcastReceiver в onResume() и onPause() регистрацию в onPause() .

В документации для Android не указано ни одного места для регистрации / отмены регистрации приемников широковещательной передачи, но в качестве возможностей они упоминаются как onStart() / onStop() и onResume() / onPause() .

Самый большой фактор в принятии этого решения – когда ваш получатель должен иметь возможность выполнять свою работу? Это определит, когда регистрировать и отменить регистрацию.

  • Нужно ли приёмщику делать что-то о трансляции только тогда, когда активность сосредоточена? Если это так, вы можете зарегистрировать / onPause() регистрацию в onPause() / onReceive() . (Вы также можете использовать более длительный срок службы, например, onStart() / onStop() , но тогда вы должны проверить во время onReceive() , что активность находится в фокусе.

  • Требуется ли приемнику что-то делать, когда оно видимо, даже если оно не имеет фокуса (например, когда отображается диалог)? Если это так, используйте onStart() / onStop() (или более продолжительное время жизни, но опять же, onReceive() должно быть проверено, видна ли активность).

  • Должен ли приемник знать о трансляции, даже если активность не видна? Например, нужно ли помнить, что что-то произошло, так что, когда активность становится видимой, она может отражать возникающее состояние дел? Затем вам необходимо использовать onCreate() / onDestroy() для регистрации / отмены регистрации. (Обратите внимание, что существуют другие способы реализации такого рода функций.)

Если вы зарегистрировались в onStart() , не регистрируйте их также в onResume() , потому что это будет избыточно: onResume() никогда не onStart() без onStart() .

Также имейте в виду, что лучше держать onPause () максимально легким :

Выполнение onPause () очень кратковременно и не обязательно позволяет достаточно времени для выполнения операций сохранения. По этой причине вы не должны использовать onPause () для сохранения приложений или пользовательских данных, совершать сетевые вызовы или выполнять транзакции базы данных; Такая работа может не завершиться до завершения метода. Вместо этого вы должны выполнять операции остановки большой нагрузки во время onStop ().

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