Мне нужно создать настраиваемый широковещательный приемник в событии 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 для действия также должны регистрировать и отменять регистрацию широковещательного приемника.
Я действительно хочу понять, что для этого считается лучшим и почему.
android
broadcastreceiver
Jamesc
источник
источник
onDestroy()
вызове события больше не будут прослушиваться получателем.Ответы:
Вы должны зарегистрировать и отменить регистрацию ваших получателей
onStart()
иonStop()
.Единственная причина, по которой Activity будет регистрировать
BroadcastReceiver
s, - это каким-то образом использовать события в текущем действии, чтобы информировать пользователя о событии. ЕслиonStop()
был вызван, тоActivity
он больше не находится на переднем плане и, следовательно, не может обновить пользователя.Если вы хотите получать широковещательные события в фоновом режиме, вам следует рассмотреть возможность использования указанной здесь службы .
Как говорит Константин, звонок
onDestroy()
не гарантируется, и вы можете продолжать получать трансляции в течение долгого времени, когдаActivity
перестанет работать.источник
Поскольку
onDestroy()
звонок не гарантируется, вы должны использовать егоonPause()
для отмены регистрации. Рассмотрите жизненный цикл вашего широковещательного приемника: нужно ли вам, чтобы он был активен только тогда, когда ваша деятельность находится на переднем плане? Затем используйтеonResume()
/onPause()
источник
В документации Android не прописано единое место для регистрации / отмены регистрации широковещательных приемников, но упоминаются как
onStart()
/, такonStop()
иonResume()
/onPause()
как возможности.Самый важный фактор при принятии этого решения - когда ваш ресивер должен выполнять свою работу? Это определит, когда регистрировать и отменить регистрацию.
Должен ли получатель что-то делать с трансляцией только тогда, когда активность находится в фокусе? В таком случае вы можете зарегистрировать / отменить регистрацию в
onPause()
/onReceive()
. (Вы также можете использовать более длительный срок службы, напримерonStart()
/onStop()
, но тогда вы должны проверить во время приема получателя, находитсяonReceive()
ли действие в фокусе.)Должен ли получатель что-то делать, когда он виден, даже если у него нет фокуса (например, когда отображается диалог)? Если да, используйте
onStart()
/onStop()
(или более длительный срок службы, но опять же,onReceive()
должен проверить, видна ли активность).Нужно ли получателю знать о трансляции, даже если активность не видна? Например, нужно ли помнить, что что-то произошло, чтобы, когда действие стало видимым, оно могло отражать итоговое положение дел? Затем вам нужно использовать
onCreate()
/onDestroy()
для регистрации / отмены регистрации. (Обратите внимание, что есть и другие способы реализации такой функциональности.)Если вы зарегистрируетесь
onStart()
, не регистрируйте их такжеonResume()
, потому что это будет лишним:onResume()
никогда не вызывается без предварительногоonStart()
вызова.Также имейте в виду, что лучше сделать onPause () как можно более легким :
Это правда , что
onDestroy()
это не гарантированно будет называться , если система убивает ваш процесс в целях экономии памяти. Однако, если процесс будет остановлен, он все равно не будет получать широковещательные сообщения. В таком случае действительно ли необходимо отменять регистрацию приемников вещания?источник
If you register in onStart(), don't also register them in onPause(), because that would be redundant: onPause() is never called without onStart() being called first.
это просто нелогично и сбивает с толку, особенно когда принятый ответ совершенно точен.Android может убить ваше приложение
onStop()
методом пропуска . Лучший способ решить эту проблему - зарегистрироватьсяBroadcastReceiver
вonResume()
методе и отменить регистрацию вonPause()
.источник
onStop()
aswellВы должны зарегистрировать и отменить регистрацию вашей трансляции в методах onResume () и onPause ().
если вы зарегистрируетесь в onStart () и отмените регистрацию в onStop (). на этот раз вы получите следующую проблему.
источник