web-dev-qa-db-fra.com

Android cycle de vie des objets statiques

Je crée une application de recherche d'événements, nous définissons des critères de recherche à partir d'un écran, remplissez un autre écran, puis l'utilisateur peut modifier les critères de recherche à partir du 3ème écran et aller au 4ème écran.

Pour réaliser la tâche ci-dessus, j'utilise un objet statique qui se souvient des valeurs autour de l'application et je n'ai rien à faire de plus.

Mais j'ai peur si à propos du cycle de vie des objets statiques dans Android si la mémoire est faible Android supprimer les objets statiques ???

Comme Android prend en charge le multitâche, si l'utilisateur bascule vers une autre application et lorsque l'utilisateur revient, l'application devient folle, l'objet statique est-il supprimé lorsqu'il effectue plusieurs tâches ??? n'importe quelle idée ?? et suggère également tenir un objet statique via la méthode singleton est une meilleure approche ???

96
d-man

Commençons par un peu de contexte: que se passe-t-il lorsque vous démarrez une application?
Le système d'exploitation démarre un processus et lui attribue un identifiant de processus unique et alloue une table de processus. Un processus démarre une instance de DVM (Dalvik VM); Chaque application s'exécute à l'intérieur d'un DVM.
Un DVM gère le déchargement du chargement des classes, le cycle de vie des instances, le GC, etc.

Durée de vie d'une variable statique: une variable statique prend naissance lorsqu'une classe est chargée par la JVM et meurt lorsque la classe est déchargée.

Donc, si vous créez une application Android et initialisez une variable statique, elle restera dans la JVM jusqu'à ce que l'un des événements suivants se produise:
1. la classe est déchargée
2. la JVM s'arrête
3. le processus meurt

Notez que la valeur de la variable statique persistera lorsque vous basculerez vers une activité différente d'une autre application et qu'aucune des trois précédentes ne se produit. Si l'un des trois facteurs ci-dessus se produit, le statique perdra sa valeur.

Vous pouvez tester cela avec quelques lignes de code:

  1. afficher la statique non initialisée dans onCreate de votre activité -> devrait afficher null
  2. initialiser la statique. l'imprimer -> la valeur serait non nulle
  3. Appuyez sur le bouton de retour et accédez à l'écran d'accueil. Remarque: l'écran d'accueil est une autre activité.
  4. Relancez votre activité -> la variable statique sera non nulle
  5. Tuez votre processus de candidature à partir de DDMS (bouton d'arrêt dans la fenêtre des appareils).
  6. Redémarrez votre activité -> le statique aura une valeur nulle.

J'espère que ça t'as aidé.

232
Samuh

Eh bien, le modèle Singleton est également basé sur l'utilisation de variables statiques, donc vous seriez en fait dans la même position. Bien que l'approche statique puisse fonctionner la plupart du temps, il peut arriver que dans certains cas, lorsque la mémoire est pleine et qu'une autre activité occupe le premier plan avant que votre application ne passe à son écran suivant, le processus de votre activité peut être interrompu et vous perdez les valeurs statiques. Cependant, Android offre quelques options de persistance de valeurs entre états ou de leur transmission, telles que:

  • en utilisant une intention, vous pouvez transmettre vos critères de recherche d'une activité à l'autre (comme pour une demande Web http)
  • en utilisant les préférences de l'application, vous pouvez enregistrer les valeurs et les récupérer dans l'activité qui en a besoin
  • en utilisant la base de données sqlite, vous pouvez les conserver dans une table et les récupérer plus tard
  • si vous devez simplement enregistrer l'état de l'activité afin qu'au redémarrage, les champs soient remplis avec leurs valeurs précédemment sélectionnées, vous pouvez implémenter la méthode d'activité onSaveInstanceState () - notez que cela n'est pas recommandé pour la persistance des états entre les activités.

Vous pouvez obtenir des exemples de code d'utilisation des préférences, des intentions et de la base de données sqlite en consultant l'arborescence du code source Aegis-shield dans le code Google ou dans d'autres applications open source Android .

16
r1k0

@ r1k0 est ici. Le stockage de données dans des champs statiques d'une classe ne persistera pas de lui-même à travers le processus d'application tue et redémarre. Android tue régulièrement les processus (exécutant des applications) lorsqu'il a besoin de mémoire.

Par le Android doc: état d'activité et éjection de la mémoire ,

Le système ne tue jamais directement une activité. Au lieu de cela, il tue le processus dans lequel l'activité s'exécute, détruisant non seulement l'activité mais aussi tout le reste en cours d'exécution dans le processus.

Vous pouvez enregistrer et restaurer l'état des primitives ainsi que des objets sérialisables et parcellables en utilisant les méthodes ci-dessous. Ceux-ci sont automatiquement appelés pendant le cycle de vie normal des activités.

protected void onSaveInstanceState(Bundle state) {}
protected void onRestoreInstanceState(Bundle savedInstanceState){}

Donc, si vous avez une classe qui n'a que des variables statiques, vous pouvez enregistrer l'état de chaque champ dans onSaveInstanceState () et les restaurer dans onRestoreInstanceState (). Lorsque Android tue le processus dans lequel votre application s'exécute, l'état de vos variables sera enregistré et lorsque Android restaure votre application, les valeurs seront restauré en mémoire dans le même état que précédemment.

3
eric.mcgregor