web-dev-qa-db-fra.com

Android: OnDestroy n'est pas appelé lorsque je ferme l'application à partir du bouton des applications récentes.

Quand on appuie sur ce bouton  

Nous voyons les applications que nous n'avons pas fermées, comme ceci  

Mais lorsque nous souhaitons fermer une application à partir de cet écran (sous l'image), la méthode onDestroy () n'est pas appelée, mais l'application est fermée. Je dois appeler onDestroy () lorsque l'application est fermée de cette façon. Comment puis-je faire ceci?  

13
Curio

Comme spécifié dans la documentation Android, il n'est pas garanti que onDestroy() sera appelé lors de la sortie de votre application.

"Il y a des situations où le système va simplement tuer le processus d'hébergement de l'activité sans appeler cette méthode"

https://developer.Android.com/reference/Android/app/Activity.html#onDestroy%28%29

Au lieu de cela, vous pouvez créer un service qui sera averti lorsque la tâche dans laquelle vos activités sont exécutées est détruite.

Créer la classe de service:

public class ClosingService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent);

        // Handle application closing
        fireClosingNotification();

        // Destroy the service
        stopSelf();
    }
}

Déclarez/enregistrez votre service dans le manifeste (dans la balise de l'application, mais en dehors de toute balise d'activité):

<service Android:name=".services.ClosingService"
             Android:stopWithTask="false"/>

Si vous spécifiez stopWithTask="false", la méthode onTaskRemoved() sera déclenchée dans votre service lorsque la tâche sera supprimée du processus.

Ici, vous pouvez exécuter la logique de votre application de fermeture avant d'appeler stopSelf() pour détruire le service.

19
Charlie

Vous devriez lire des informations sur le cycle de vie de l'activité. Il y a une chose à propos de la méthode onDestroy, elle n'est pas appelée tout le temps. Vous ne devez pas compter dessus.

Précisez s'il vous plaît ce que vous essayez d'atteindre et je vais essayer d'offrir une meilleure solution.

Suggestion

Donc, si je vous ai bien compris, je peux suggérer une chose. Démarrez une Service qui déclenchera LocalBroadcast toutes les N secondes (le système n’est pas vraiment lourd). Inscrivez-vous et BroadcastReceiver pour cette émission dans Activities. De cette façon, vous obtiendrez true ou false selon qu'il existe ou non une BroadcastReceiver pouvant saisir votre LocalBroadcast. Et si aucun destinataire ne vérifie que quelque valeur SharedPreferences indique si Button a été enfoncé.

1
Ekalips