Lorsque pour annuler l'inscription de BroadcastReceiver? Dans onPause(), onDestroy(), ou onStop()?
Quand dois-je utiliser unregisterReceiver? Dans onPause()
, onDestroy()
, ou onStop()
?
Note: j'ai besoin de ces services pour s'exécuter en arrière-plan.
Mise à jour:
-
J'obtiens une exception libérant des récepteurs
null
. -
Activité a fui l'intention des récepteurs de vous manquent appel à
unregisterReceiver();
Veuillez me dire si il ya quelque chose de mal, voici mon code:
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());
}
}
- Tout d'abord, vous ne jamais avoir à appeler les méthodes de cycle de vie comme onPause(), onDestroy() ou onStop().
- Quel est le comportement attendu de votre application? Tous les cas mentionnés ci-dessus sont valables, tout dépend de votre cas d'utilisation
Vous devez vous connecter pour publier un commentaire.
il dépend de l'endroit où vous devez enregistrer le récepteur. La méthode complémentaire paires sont
si vous vous inscrivez le récepteur dans la première, puis annulez l'inscription en elle de la fin de la méthode.
De la Android documentation:
Ensuite, je voudrais suivre ces paires (à l'aide de @StinePike de l'analogie):
En raison de la Android Cycle De Vie, et comme @w3bshark mentionné:
Un récepteur de radiodiffusion est un composant invisible. Tout ce qu'il fait de répondre à un certain type de changement, par onReceive() de rappel.
Il est donc logique de les activer , seulement si votre activité est en état de répondre ou quand il est en train de devenir Activé /active - qui est quand onResume() est appelée.
De sorte qu'il est préférable de s'inscrire dans onResume() - Lorsque l'activité est visible & Activé et annuler l'inscription dans onStop() lorsque l'activité n'est plus Actif.
Il est tout aussi simple que cela, si vous voulez écouter les événements, même si votre activité n'est pas visible alors appel d'annuler l'inscription dans onStop()
(E. g D'Activité vous ouvrez l'Activité B, mais si vous voulez toujours à l'écoute pour la suite des événements).
Mais lorsque vous souhaitez uniquement écouter que pour les événements lorsque votre activité est visible que dans onPause appel unregister()
(E. g à Partir de l'Activité de l'ouverture de l'Activité B, mais maintenant, vous ne voulez pas écouter les événements en activité).
Espère que cela aide votre problème.