Quand dois-je utiliser unregisterReceiver? Dans onPause()
, onDestroy()
ou onStop()
?
Remarque: j'ai besoin que le service s'exécute en arrière-plan.
Mise à jour:
Je reçois une exception libérant les récepteurs null
.
L'activité a fuit des destinataires intentionnels vous manque l'appel à unregisterReceiver();
Veuillez me dire s'il y a quelque chose qui ne va pas, 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());
}
}
cela dépend de l'endroit où vous avez enregistré le récepteur. Les paires de méthodes complémentaires sont
onCreate - onDestroy
onResume - onPause
onStart - onStop
si vous enregistrez le récepteur dans le premier, désenregistrez-le dans sa méthode de fin.
De la documentation Android :
Vous devez implémenter onStop () pour libérer des ressources d'activité telles qu'une connexion réseau ou pour désenregistrer des récepteurs de diffusion.
Ensuite, je suivrais ces paires (en utilisant l'analogie de @ StinePike):
onResume - onPause
onStart - onStop
À cause de Android Lifecycle , et comme @ w3bshark l'a mentionné:
Sur les appareils post-HoneyComb (3.0+), onStop () est le dernier gestionnaire garanti.
C'est aussi simple que cela, si vous voulez écouter des événements même lorsque votre activité n'est pas visible, appelez alors unregister dans onStop () (Par exemple, de l'activité A vous ouvrez l'activité B mais si vous voulez que A écoute toujours les événements) .
Mais lorsque vous ne souhaitez écouter que les événements lorsque votre activité est visible, dans onPause, appelez unregister () (par exemple, à partir de l'activité A, vous avez ouvert l'activité B, mais maintenant vous ne voulez pas écouter les événements de l'activité A).
J'espère que cela aide votre problème.
Un récepteur de diffusion est un composant invisible. Tout ce qu'il fait, il répond à une sorte de changement via le rappel onReceive ().
Il est donc logique de les activer, uniquement lorsque votre activité est en état de répondre ou lorsqu'elle devient activée/active - c'est-à-dire lorsque onResume () est appelé.
Il est donc préférable de s'inscrire dans onResume () - lorsque l'activité est visible et activée et de se désinscrire dans onStop () lorsque l'activité n'est plus active.