web-dev-qa-db-fra.com

Android: onDestroy () ou une méthode similaire dans la classe Application

J'étends la classe Application pour qu'elle fonctionne avec certaines variables globales nécessitant un contexte. Je sais qu’il existe une méthode onCreate () dans la classe Application qui est appelée avant toute autre activité onCreate (), mais je voudrais savoir s’il existe une méthode onDestroy () ou similaire dans la classe Application qui pourrait être remplacée afin que je puisse stocker des variables dans la mémoire persistante, désenregistrer un auditeur et envoyer le dernier message au serveur avant que le processus d'application ne soit tué? Si non, y a-t-il un autre moyen de le faire?

61
Maybe Julius

Il n’existe pas de rappel de ce type sur un périphérique de production de la classe Application.

Les opérations que vous souhaitez effectuer doivent généralement être effectuées immédiatement après les modifications ou dans la fonction onPause() du composant d'application concerné.

27
Raghav Sood

Dans Android, il n'y a pas de concept de fermeture d'une application. L’utilisateur vient de quitter: c’est le seul événement dont vous aurez connaissance (onPause() dans une activité). Vous devez adapter la conception de votre application à ce cycle de vie.

Vous ne devriez pas essayer de trouver une solution de contournement, cela pourrait aggraver la situation: que se passera-t-il si l'utilisateur manque de batterie ou si votre application plante? toutes les données seront perdues. Je ne sais pas quel type de données vous utilisez, mais cela donne généralement une mauvaise note sur Google Play. Même si quelque chose de mauvais se produit, toutes les données doivent déjà être sauvegardées (AsyncTasks sont parfaits pour cela, n’ayez pas peur de commencer à chaque changement pour sauvegarder les données en permanence).

6
Dalmas

Tout d'abord: je suis un débutant absolu

J'ai besoin d'exécuter du code lorsque mon application est sortie (oui, je ne sais pas ce genre de chose sous Android) et cela fonctionne bien pour moi:

-J'ai MyApplication qui étend l'application. En tant que membre de MyApplication, il existe un champ AtomicInteger nommé activeActivitiesNumber et une méthode getter publique.

-Toutes les activités de l’application étendent MyActivy (qui étend elle-même Activité) 

-MyActivity annule les méthodes onCreate, onResume et onStop et dispose également d'un champ protégé: Protected MyAppication mAppState;

a) OnCreate(){
super.onCreate();
mAppState=this.getApplication();...}


b) onResume(){
super.OnResume();
myAppState.getactiveActivitiesNumber().addAndGet(1)
....}

c) onStop(){
super.onStop()

if (myAppStatemyAppState.getactiveActivitiesNumber()..decrementAndGet()<1){
...call exiting code (for instance a public method defined in MyApplication}
}

Il y a un problème: si vous démarrez une activité, le bronzage n'appartenant pas à votre application (par exemple, envoyez un e-mail), la méthode existante sera déclenchée.

Un autre problème (ne savez pas s’il s’agit d’un problème réel ou théorique) est qu’il n’ya aucune garantie que dans certaines situations onStop sera appelé.

J'espère que cette aide.

4

Vous pouvez remplacer onDestroy() dans la Activity qui sera la dernière fermée dans votre application et vérifier si elle est terminée. Dans ce cas, votre code ne sera pas appelé lors d'une rotation de périphérique. Mais vous devez savoir que onDestroy() n'est pas appelé lorsqu'une application est fermée via le bouton d'accueil du périphérique.

@Override
public void onDestroy(){
    super.onDestroy();
    if(isFinishing()){
        //do your stuff here
    }
}
1
dzikovskyy

Vous pouvez utiliser registerActivityLifecycleCallbacks() dans la classe Application avec les rappels suivants (je vous recommande de créer une classe AppLifecycleCallbacks qui étend la ActivityLifecycleCallbacks):

public interface ActivityLifecycleCallbacks {
    void onActivityCreated(Activity activity, Bundle savedInstanceState);
    void onActivityStarted(Activity activity);
    void onActivityResumed(Activity activity);
    void onActivityPaused(Activity activity);
    void onActivityStopped(Activity activity);
    void onActivitySaveInstanceState(Activity activity, Bundle outState);
    void onActivityDestroyed(Activity activity);
}
0
box