web-dev-qa-db-fra.com

Quand désinscrire BroadcastReceiver? Dans onPause (), onDestroy () ou onStop ()?

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:

  1. Je reçois une exception libérant les récepteurs null.

  2. 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());
    }

}
30
Muhammad

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.

78
stinepike

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.

9
Evin1_

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.

1
Sudhanshu Gaur

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.

1
WonderBoy