Dans ce chapitre, nous allons voir comment fonctionne le cycle de vie d’une application Android. C'est un sujet très important qui est très spécifique au développement mobile. En effet, par rapport à un site web, une application sur un smartphone peut être dans différents états. Par exemple, elle peut être démarrée et affichée à l’écran, ou masquée mais toujours active en tâche de fond, affichée en mode portrait ou en mode paysage, etc. En tant que développeurs et développeuses, nous devons être capables de détecter ces différents états dans notre code afin de faire réagir en conséquence notre application.
Autre parallèle, lorsque votre réveil sonne le matin, vous passez de l'état endormi à l'état réveillé. Ensuite, lorsque vous vous levez puis vous préparez à aller travailler, vous passez de l'état réveillé à opérationnel. Tout au long d’une journée, vous passez d'un état à l'autre.
Sous Android, une activité passe également par différents états. Entre deux états, le système appelle certaines méthodes bien spécifiques, dans un ordre déterminé.
Voici les différents états dans lesquels une activité peut se trouver :

Par défaut, la méthodeonCreate()est automatiquement surchargée lorsque vous créez une nouvelle activité. Mais comme vous pouvez le voir sur le diagramme ci-dessus, il en existe d'autres, que nous allons découvrir maintenant.
onCreate()Cette méthode est appelée lorsque votre activité est créée par le système, et qu'elle entre dans l'étatCreated.
Généralement, les opérations effectuées dans cette méthode servent à mettre en place l'interface graphique et à initialiser les données qui seront utilisées par l’interface.
À ce stade, l'activité est créée, mais l'utilisateur ne la voit pas encore et ne peut pas interagir avec.
onStart()Cette méthode est appelée par le système lorsque l'activité entre dans l'étatStarted. L'interface graphique devient visible à l'utilisateur, mais il ne peut pas encore interagir avec les différents éléments.
onResume()Cette méthode est appelée lorsque l'activité entre dans l'étatResumed. L'activité devient entièrement opérationnelle. L'utilisateur peut utiliser l'application et cliquer sur les différents éléments graphiques.
L'application reste dans cet état tant qu'il n'y a pas d'interruption, comme par exemple la réception d'un appel téléphonique, le démarrage d'une nouvelle activité ou l'affichage d'une boîte de dialogue.
onPause()Cette méthode est appelée lorsque l'activité entre dans l'étatPaused. Une Activity passe par exemple dans l’étatPaused lorsqu’une AlertDialog est affichée : l’Activity sous-jacente est toujours visible, mais elle n’est pas au premier plan. Cette méthode est “l’inverse” de la méthode onResume() : tout ce qui est initié dansonResume()doit être mis en pause dans cette méthode. Par exemple, une animation présentée à l'utilisateur est démarrée dansonResume()puis stoppée dansonPause().
Les traitements effectués dans cette méthode doivent être les plus courts possible.
onStop()Cette méthode est appelée lorsque l'activité entre dans l'étatStopped. Par exemple, lorsqu'une nouvelle activité est démarrée, l'activité appelante va se retrouver dans cet état. Elle n'est donc plus du tout visible à l'utilisateur. Les traitements liés à la mise à jour de l'interface graphique peuvent être arrêtés.
onDestroy()Cette méthode est appelée lorsque l'activité est arrêtée.
Séchez vos larmes, c'est normal :) La première fois, cela effraie toujours un peu. Nous allons mettre tout cela en pratique et vous irez tout de suite mieux.
Nous avons vu précédemment qu’un fragment correspond à une portion de l’interface. Il possède également son propre cycle de vie, et celui-ci est étroitement lié à celui de l’activité à laquelle il appartient. Entre deux états de son cycle de vie, le système appelle également certaines méthodes bien spécifiques qui s'enchaînent comme illustré ci-dessous selon l’état de l’application.

Vous remarquez certainement que certaines de ces méthodes, comme onCreate() , onStart ou onPause() , ont le même nom que celles appelées par le système pour le cycle de vie d’une activité. Vous pouvez vous référer aux définitions données précédemment pour comprendre dans quel état se trouve le fragment lorsque ces méthodes sont appelées, en remplaçant bien sûr le terme activité par fragment. Définissons ci-dessous les méthodes spécifiques au cycle de vie d’un fragment.
onAttach()Cette méthode est appelée lorsqu’un fragment est ajouté à une activité. Elle est appelée une seule fois durant toute la durée de vie du fragment.
onCreateView()Cette méthode est appelée par le système afin de créer l’interface utilisateur correspondant au fragment. C’est en surchargeant cette méthode que nous indiquons au système la vue qu’il doit dessiner précisément à l’écran.
onViewCreated()Cette méthode est appelée immédiatement après que le système a rattaché la vue au fragment.
onDestroyView()À ce stade, la vue associée au fragment n’est plus affichée à l’écran. Mais l’objet fragment existe toujours. C’est dans cette fonction que, si besoin, vous allez pouvoir nettoyer des choses spécifiques à votre interface avant que le fragment soit complètement dans la fonction onDestroy() qui suit.
onDetach()Cette fonction est appelée après onDestroy() , et nous informe que le fragment a été dissocié de son activité parente.
Pour bien comprendre l'enchaînement des méthodes, je vous invite à toutes les surcharger (sauf onCreate() qui l'est déjà) dans votre activité et votre fragment, et d'afficher leur appel dans la console. Pour rappel, l'affichage d'une trace en Android s'effectue de la sorte :
Log.d(TAG, "onStart() called");Comme TAG, vous pouvez utiliser ce que vous voulez. Personnellement, j’utilise mon prénom pour le retrouver facilement plus tard dans le LogCat !
Le cycle de vie d’une activité ou d’un fragment comporte différentes étapes qui se déroulent entre sa création, son affichage à l’écran et sa suppression.
Les classes Activity et Fragment exposent des fonctions qui correspondent à ces différentes étapes.
En surchargeant ces fonctions, nous pouvons exécuter du code à des instants clés du cycle de vie. Par exemple en surchargeant la fonction onCreate de la classe Activity pour initialiser son contenu, ou dans la fonction onDestroy pour refermer une connexion à la base de donnée.
Cela fait beaucoup de fonctions et beaucoup de concepts à retenir, mais bonne nouvelle pour vous, au quotidien vous aurez surtout besoin de surcharger les fonctions onCreate (et onCreateView et onViewCreated pour un fragment), onStart() et onResume() . D’ailleurs vous l’avez déjà fait dans cette partie.
Dans la prochaine partie, nous allons dynamiser les questions et les réponses de notre quiz. Nous en profiterons pour nous pencher sur une notion d'architecture logicielle : l'architecture MVVM.