Когда регистрировать / отменять регистрацию широковещательных приемников, созданных в действии?
Мне нужно создать пользовательский широковещательный приемник в событии 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 для активности также должны регистрировать и отменять регистрацию широковещательного приемника.
Я действительно хочу понять, что считается быть лучшей практики для этого и почему.
4 ответа:
вы должны зарегистрировать и отменить регистрацию ваших получателей
onStart()иonStop().единственная причина, по которой активность будет регистрироваться
BroadcastReceivers - это использовать события каким-то образом на текущей деятельности, чтобы сообщить пользователю о событии. ЕслиonStop()был вызван, тогдаActivityбольше не находится на переднем плане, и поэтому не может обновить пользователя.если вы хотите получать широковещательные события в фоновом режиме, вы должны рассмотреть возможность использования услуги как указано здесь.
как Константин говорит:
onDestroy()не гарантируется вызов, и вы можете продолжать получать трансляции в течение длительного времени, когдаActivityбольше не открыть.
как
onDestroy()не гарантируется, что вы будете использоватьonPause()отменить. Рассмотрим жизненный цикл вашего широковещательного приемника: вам нужно, чтобы он был активным, только когда ваша деятельность находится на переднем плане? Тогда используйтеonResume()/onPause()
Android может убить ваше приложение с опущением
onStop()метод. Лучший способ решить эту ситуацию-зарегистрироватьсяBroadcastReceiverinonResume()метод и отменить регистрацию вonPause().
документация Android не предписывает одно место для регистрации / отмены регистрации широковещательных приемников, но он упоминает и
onStart()/onStop()иonResume()/onPause()в качестве возможностей.самый большой фактор в принятии этого решения, когда ваш приемник должен быть в состоянии сделать свою работу? Это определит, когда регистрировать и отменять его.
должен ли приемник что-то делать с трансляцией только тогда, когда активность находится в фокусе? Если это так, вы можете зарегистрировать / отменить регистрацию в
onPause()/onReceive(). (Вы также можете использовать более длительный срок службы, такие какonStart()/onStop(), но тогда вы должны проверить во время получателяonReceive()находится ли активность в фокусе.)должен ли приемник что-то делать, когда он виден, даже если он не имеет фокуса (например, когда отображается диалоговое окно)? Если да, то используйте
onStart()/onStop()(или более длительный срок службы, но опять же, приемникonReceive()должны проверить видна ли активность).должен ли приемник знать о трансляции, даже если активность не видна? Например, нужно ли помнить, что что-то произошло, так что когда активность становится видимо, это может отражать результирующее положение дел? Тогда вам нужно использовать
onCreate()/onDestroy()для регистрации/отмены регистрации. (Обратите внимание, что есть и другие способы реализации такого рода функциональность.)если вы зарегистрируетесь в
onStart(), не регистрируйте их также вonResume(), потому что это было бы излишним:onResume()никогда не вызывается безonStart()называться первым.также имейте в виду, что лучше держите onPause () как можно светлее:
onPause() исполнение очень короткое, и не обязательно позволяет достаточно времени для выполнения операций сохранения. По этой причине, вы должны не используйте onPause() для сохранения данных приложения или пользователя, создайте сеть вызовы или выполнение транзакций базы данных; такая работа может не завершиться до завершения метода. Вместо этого вы должны выполнять тяжелую нагрузку операции выключения во время onStop().
это правда
onDestroy()и не гарантируется, что будет называться если система убивает ваш процесс, чтобы сохранить память. Однако, если процесс будет убит, процесс все равно не будет получать широковещательные передачи. В таком случае, действительно ли необходимо отменить регистрацию широковещательных приемников?