Ответ 1
это зависит от того, где вы зарегистрировали приемник. Параллельные пары методов
onCreate - onDestroy
onResume - onPause
onStart - onStop
если вы зарегистрируете приемник в первом, затем отмените его в методе завершения.
Когда следует использовать unregisterReceiver? В onPause()
, onDestroy()
или onStop()
?
Примечание. Мне нужно, чтобы служба выполнялась в фоновом режиме.
Update:
Я получаю исключения, освобождающие приемники null
.
Активность просочилась в приемники намерений, если вам не нужен вызов unregisterReceiver();
Скажите, пожалуйста, если что-то не так, вот мой код:
private boolean processedObstacleReceiverStarted;
private boolean mainNotificationReceiverStarted;
protected void onResume() {
super.onResume();
try {
registerReceivers();
} catch (Exception e) {
Log.e(MatabbatManager.TAG,
"MAINActivity: could not register receiver for Matanbbat Action "
+ e.getMessage());
}
}
private void registerReceivers() {
if (!mainNotificationReceiverStarted) {
mainNotificationReceiver = new MainNotificationReceiver();
IntentFilter notificationIntent = new IntentFilter();
notificationIntent
.addAction(MatabbatManager.MATABAT_LOCATION_ACTION);
notificationIntent
.addAction(MatabbatManager.MATABAT_New_DATA_RECEIVED);
notificationIntent
.addAction(MatabbatManager.STATUS_NOTIFCATION_ACTION);
registerReceiver(mainNotificationReceiver, notificationIntent);
mainNotificationReceiverStarted = true;
}
if (!processedObstacleReceiverStarted) {
processedObstacleReceiver = new ProcessedObstacleReceiver();
registerReceiver(processedObstacleReceiver, new IntentFilter(
MatabbatManager.MATABAT_ALARM_LOCATION_ACTION));
processedObstacleReceiverStarted = true;
}
}
private void unRegisterReceivers() {
if (mainNotificationReceiverStarted) {
unregisterReceiver(mainNotificationReceiver);
mainNotificationReceiverStarted = false;
}
if (processedObstacleReceiverStarted) {
unregisterReceiver(processedObstacleReceiver);
processedObstacleReceiverStarted = false;
}
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
try {
unRegisterReceivers();
mWakeLock.release();//keep screen on
} catch (Exception e) {
Log.e(MatabbatManager.TAG, getClass() + " Releasing receivers-" + e.getMessage());
}
}
это зависит от того, где вы зарегистрировали приемник. Параллельные пары методов
onCreate - onDestroy
onResume - onPause
onStart - onStop
если вы зарегистрируете приемник в первом, затем отмените его в методе завершения.
Вы должны реализовать onStop(), чтобы освободить ресурсы активности, такие как сетевое подключение или отменить регистрацию широковещательных приемников.
Затем я буду следовать за этими парами (используя аналогию @StinePike):
onResume - onPause
onStart - onStop
Из-за Android Lifecycle, и как @w3bshark упомянул:
В устройствах post-HoneyComb (3.0+) onStop() является последним гарантированным обработчиком.
Широковещательный приемник является невидимым компонентом. Все это реагирует на какое-то изменение через обратный вызов onReceive().
Таким образом, имеет смысл активировать их, только когда ваша активность находится в состоянии реагирования или когда она становится Enabled/active - которая вызывается при вызове функции onResume().
Итак, лучше зарегистрироваться в onResume() - Когда активность видна и включена и отменена в onStop(), когда активность больше не активна.
Это так же просто, если вы хотите прослушивать события, даже если ваша активность не видна, а затем отмените регистрацию в onStop() (Например, из Activity A вы открываете действие B, но если вы хотите, чтобы A все еще слушал события).
Но когда вы хотите слушать только события, когда ваша активность видна, а затем в onPause call unregister() (Например, из Activity A вы открыли Activity B, но теперь вы не хотите слушать события в действии A).
Надеюсь, это поможет вашей проблеме.