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