173 votes

Que fait exactement la méthode Activity.finish() ?

Je développe des applications Android depuis un certain temps, et j'ai suivi de nombreux posts sur le cycle de vie des activités, et le cycle de vie des applications.

Je sais que Activity.finish() fait appel quelque part à la méthode Activity.onDestroy() Je suppose que cela indique au système d'exploitation et au ramasse-miettes qu'il peut "faire son truc" et libérer la mémoire lorsqu'il le juge opportun....

Je suis arrivé à ce poste - Est-il mal vu de quitter une application ? et lisez la réponse de Mark Murphy.

Cela m'a rendu un peu confus quant à la nature exacte de la finish() est en fait le résultat de cette méthode.

Y a-t-il une chance que j'appelle finish() y onDestroy() ne sera pas appelé ?

193voto

K_Anas Points 13724

Lors de l'appel finish() sur une activité, la méthode onDestroy() est exécuté. Cette méthode permet d'effectuer des opérations telles que

  1. Désactive toutes les boîtes de dialogue gérées par l'activité.
  2. Fermer tous les curseurs gérés par l'activité.
  3. Fermer toute boîte de dialogue de recherche ouverte

También, onDestroy() n'est pas un destructeur. Il ne détruit pas réellement l'objet. C'est juste une méthode qui est appelée en fonction d'un certain état. Ainsi, votre instance est toujours en vie et se porte très bien* après l'appel de la méthode onDestroy() Android conserve les processus au cas où l'utilisateur voudrait redémarrer l'application, ce qui accélère la phase de démarrage. Le processus ne fera rien et si la mémoire doit être récupérée, le processus sera tué.

93voto

nag prakash Points 145

Mes 2 cents sur la réponse de @K_Anas. J'ai effectué un test simple sur la méthode finish(). Liste des méthodes de rappel importantes dans le cycle de vie d'une activité

  1. Appel de finish() dans onCreate() : onCreate() -> onDestroy()
  2. Appel de finish() dans onStart() : onCreate() -> onStart() -> onStop() -> onDestroy()
  3. Appel de finish() dans onResume() : onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy()

Ce que je veux dire, c'est que les contreparties des méthodes ainsi que toutes les méthodes intermédiaires sont appelées lorsque la fonction finish() est exécutée.

eg :

 onCreate() counter part is onDestroy()
 onStart() counter part is onStop()
 onPause() counter part is onResume()

45voto

Dan Wears Prada Points 429

Remarquez également que si vous appelez finish() après une intention, vous ne pouvez pas revenir à l'activité précédente avec le bouton "back".

startActivity(intent);
finish();

13voto

Kazekage Gaara Points 7978

onDestroy() est destiné au nettoyage final - libérer les ressources que vous pouvez utiliser par vous-même, fermer les connexions ouvertes, les lecteurs, les écrivains, etc. Si vous n'y dérogez pas, le système fait ce qu'il doit faire.

d'autre part, finish() permet simplement au système de savoir que le programmeur souhaite que la version actuelle de l'application soit utilisée. Activity à terminer. C'est ainsi qu'il fait appel à onDestroy() après cela.

À noter :

il n'est pas nécessaire que seulement un appel à finish() déclenche un appel à onDestroy() . Comme nous le savons, le système Android est libre de supprimer des activités s'il estime que des ressources sont nécessaires à l'activité en cours. Activity qui doivent être libérés.

11voto

Brandon Lim Points 26

En plus de la réponse de @rommex ci-dessus, j'ai également remarqué que finish() ne met pas en file d'attente la destruction de l'activité et qu'elle dépend de la priorité de l'activité.

Si j'appelle finish() après onPause() Je vois onStop() et onDestroy() a immédiatement appelé.

Si j'appelle finish() après onStop() Je ne vois pas onDestroy() jusqu'à 5 minutes plus tard.

D'après mon observation, il semble que l'arrivée soit en file d'attente et lorsque j'ai regardé le fichier adb shell dumpsys activity activities il a été fixé à finishing=true mais comme il n'est plus au premier plan, il n'a pas été détruit en priorité.

En résumé, onDestroy() n'est jamais garantie d'être appelée, mais même dans le cas où elle l'est, elle peut être retardée.

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