57 votes

Cycle de vie de la classe d'application Android

L'appli android, je suis en train de travailler sur des remplacements de la classe d'Application de magasin léger état (nom d'utilisateur, localisation gps, etc) en statique vars. La plupart de cet état est défini dans le OnCreate de l'activité de lancement (nom d'utilisateur (extrait de préf., emplacement de l'auditeur). Est-il sécuritaire de s'appuyer sur l'activité de lancement pour initialiser la classe d'Application? Existe-il des cas où la classe Application qui pourrait être re-créé sans le Lancement de l'activité également en cours de création?

La question se pose parce que je suis tombé sur une exception de pointeur null accéder à une variable dans la classe d'Application sur la reprise de l'application après le téléphone a été endormi pendant plusieurs heures (l'application a gauche au premier plan, avant que le téléphone est allé dormir). Est-il possible que le processus a été tué alors que le téléphone était endormi et au réveil, le téléphone, la classe d'Application a été re-créé, le top de l'activité dans la pile a repris, mais le lancement de l'activité.onCreate n'était pas courir ainsi, la classe d'Application n'était pas initialisé?

Notez que j'ai essayé de tester ces types de scénarios en Forçant l'Application de cesser d'utiliser les Paramètres / Gérer les applications. Cependant, je ne suis pas en mesure de reproduire le problème. Sur la prochaine course, la classe d'Application est créée, suivie par le lancement de l'activité.onCreate.

Est-il sûr de supposer que la Demande instance de classe existera tant que le processus, et que lorsque l'Application classe est créée, elle est l'équivalent de "redémarrage" de l'application ie. commencer une nouvelle activité de la pile (et la première activité de la pile est le lancement de l'activité)?

20voto

Yoni Samlan Points 21748

Pas de. L'ensemble de votre application peut être tué et recréé avec la tâche pile intacte; ceci permet au système de récupérer de la mémoire sur les appareils qui en ont besoin tout en présentant toujours une parfaite illusion de multitâche pour l'utilisateur final. À partir de la documentation:

Un arrière-plan de l'activité (activité qui n'est pas visible pour l'utilisateur et a été suspendu) n'est plus critique, de sorte que le système peut en toute sécurité tuer son processus pour récupérer de la mémoire pour d'autres avant-plan ou visible processus. Si son processus doit être tué, lorsque l'utilisateur revient à la l'activité (de la rendre visible sur le à nouveau à l'écran), son onCreate(Bundle) méthode sera appelée avec le savedInstanceState qu'il avait précédemment fourni dans onSaveInstanceState(Bundle) de sorte qu'il peut redémarrer lui-même dans le même état tant que l'utilisateur précédent.

Qui est, le processus (dont l'Application est liée à) peut être tué, mais ensuite redémarré, et les activités individuelles devraient avoir suffisamment d'informations pour recréer eux-mêmes de ce qu'ils ont enregistré avant d'être tués, sans compter sur l'état global fixé dans le processus par d'autres Activités.

Envisager le stockage partagé persistant de l'état qui a besoin d'initialisation par une Activité dans un SharedPreference ou de base de données SQLite, ou de le transmettre à des Activités qui ont besoin de lui comme une Intention supplémentaire.

6voto

Darren Shen Points 11

Vous pouvez tester le scénario de référence en killing the process de votre application en cours d'exécution.

Étape 1. Ouvrez votre application, puis appuyez sur Home bouton de le cacher en arrière-plan.

Étape 2. Invoquer adb shell

Étape 3. Entrez la commande su (vous devez obtenir la RACINE de la permission pour tuer le processus)

Étape 4. ps (liste de tous les ID de processus et de trouver le vôtre)

Étape 5. kill 1234 (supposons que votre application en cours d'exécution sur le processus 1234)

Étape 6. Ensuite, retournez à votre appareil et cliquez sur l'icône de lancement de nouveau. Vous pouvez trouver la dernière activité sur l'activité de la pile est de rouvrir. Vous pouvez également trouver d' onRestoreInstanceState() méthode est appelée pour l'activité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X