Le cycle de vie d’une activité

Comprendre le cycle de vie d’une activité est essentiel — cela vous permet d’écrire des applications fluides

Et de mieux gérer les ressources de l’application.

Pour offrir une meilleure expérience utilisateur.

Les activités Android peuvent se superposer.

À chaque fois que vous lancez une nouvelle activité, elle recouvre la précédente.

Ensuite, en appuyant sur le bouton retour, l’activité actuelle est détruite et la précédente réapparaît.

En réalité, Android utilise un système de tâches (Task) pour les gérer.

Une tâche est un ensemble d’activités stockées dans une pile.

Cette pile est appelée la pile de retour (Back Stack).

Une pile est une structure de données de type LIFO (dernier entré, premier sorti).

Par défaut, lorsque vous lancez une nouvelle activité, elle est empilée et placée tout en haut.

Lorsque vous appuyez sur le bouton retour ou que vous appelez finish(), l’activité au sommet de la pile est détruite. L’activité précédente remonte alors en haut. Le système affiche toujours à l’utilisateur l’activité située au sommet de la pile.

Les états d’une activité

Au cours de son cycle de vie, une activité peut se trouver dans quatre états différents.

1. État en cours d’exécution

Quand une activité est au sommet de la pile, le système est réticent à la récupérer car cela dégraderait l’expérience utilisateur.

2. État en pause

L’activité n’est pas au sommet de la pile mais reste visible — par exemple, lorsqu’une activité de type dialogue n’occupe qu’une partie de l’écran (similaire à une fenêtre modale). Le système évite également de les récupérer car leur disparition brusque serait déroutante pour l’utilisateur.

3. État arrêté

Une activité passe dans cet état lorsqu’elle n’est plus en haut de la pile et qu’elle devient totalement invisible. Le système conserve son état et ses variables membres, mais cela n’est pas garanti — si de la mémoire est nécessaire ailleurs, le système pourra décider de récupérer ces activités.

4. État détruit

Une fois qu’une activité est retirée de la pile de retour, elle passe à l’état détruit. C’est le type d’activité que le système récupérera en priorité pour libérer de la mémoire.

Durée de vie de l’activité et sept méthodes de rappel

La classe Activity définit sept méthodes de rappel qui couvrent chaque étape du cycle de vie.

En résumé, ces sept fonctions de rappel sont déclenchées à des moments précis du cycle de vie, et leur code est alors exécuté.

Par exemple, onCreate est déclenché lors de la première création de l’activité.

Voici les sept méthodes :

onCreate :

Appelée lors de la création de l’activité. C’est ici que vous effectuez l’initialisation — chargement de la mise en page, liaison des événements des boutons, etc.

onStart :

Déclenchée quand l’activité passe de l’état invisible à visible.

onResume :

Appelée quand l’activité est prête à interagir avec l’utilisateur. À ce stade, elle se trouve au sommet de la pile de retour et est en cours d’exécution (elle est visible pour l’utilisateur).

onPause :

Invoquée quand le système s’apprête à lancer ou à reprendre une autre activité. Vous devez y libérer les ressources gourmandes en CPU et sauvegarder les données importantes, mais l’exécution doit être rapide — sinon, l’affichage de la nouvelle activité sera retardé. (L’activité actuelle est sur le point d’être masquée, la transition vers la suivante n’est pas encore terminée.)

onStop :

Appelée quand l’activité devient totalement invisible. La différence principale avec onPause est que si la nouvelle activité lancée est de type dialogue, onPause sera appelé mais pas onStop. (L’activité est masquée et la nouvelle apparaît.)

onDestroy :

Appelée juste avant la destruction de l’activité. Après cela, l’activité passe à l’état détruit.

onRestart :

Appelée juste avant qu’une activité arrêtée repasse à l’état en cours d’exécution — autrement dit, quand l’activité est redémarrée.

Trois types de durée de vie

En dehors de onRestart, les six autres méthodes forment trois paires. On peut donc diviser la durée de vie d’une activité en trois catégories.

1. Durée de vie complète

Tout ce qui se passe entre onCreate et onDestroy constitue la durée de vie complète.

2. Durée de vie visible

La période entre onStart et onStop est la durée de vie visible. L’activité reste visible pour l’utilisateur. Ces deux méthodes permettent de gérer les ressources intelligemment — par exemple, charger les ressources dans onStart et les libérer dans onStop, afin que les activités arrêtées ne monopolisent pas la mémoire.

3. Durée de vie au premier plan

La période entre onResume et onPause est la durée de vie au premier plan. L’activité est en cours d’exécution et peut recevoir les entrées de l’utilisateur. C’est l’état avec lequel les utilisateurs interagissent le plus souvent.

Ouvrir l’activité principale → entrer dans l’activité normale → retourner à l’activité principale → retourner à l’écran d’accueil

05-12 15:32:43.899 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité principale: onCreate:
05-12 15:32:43.926 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité principale: onStart:
05-12 15:32:43.930 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité principale: onResume:
05-12 15:33:00.973 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité principale: onPause:
05-12 15:33:01.078 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité normale: onCreate:
05-12 15:33:01.079 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité normale: onStart:
05-12 15:33:01.081 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité normale: onResume:
05-12 15:33:02.969 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité principale: onStop:
05-12 15:34:01.747 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité normale: onPause:
05-12 15:34:01.779 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité principale: onRestart:
05-12 15:34:01.779 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité principale: onStart:
05-12 15:34:01.780 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité principale: onResume:
05-12 15:34:02.749 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité normale: onStop:
05-12 15:34:02.750 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité normale: onDestroy:
05-12 15:35:26.827 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité principale: onPause:
05-12 15:35:28.534 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité principale: onStop:
05-12 15:34:01.779 4316-4316/com.foxdevelop.www.lifedemo E/Journal activité principale: onDestroy:

Mise en pratique

Créons un nouveau projet pour expérimenter le cycle de vie

Nous appellerons l’activité LifeDemo.

Ajoutez une EmptyActivity comme activité principale.

Puis ajoutez deux autres activités : NormalActivity et DialogActivity.

Ensuite, modifiez leurs mises en page.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Activité normale" />

</LinearLayout>Langage du code : HTML, XML (xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Activité dialogue" />

</LinearLayout>Langage du code : HTML, XML (xml)

Leurs mises en page sont identiques, seule la texte affiché diffère.

Nous devons également transformer DialogActivity en activité de type dialogue.

Modifiez AndroidManifest.xml :

<activity android:name=".NormalActivity" />
<activity android:name=".DialogActivity" android:theme="@style/Base.Theme.AppCompat.Dialog"/>
</application>Langage du code : HTML, XML (xml)

Cela applique un thème de dialogue à DialogActivity.

Mise en page de l’activité principale

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Ouvrir l'activité normale" />
    <Button
        android:id="@+id/buttondialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Ouvrir l'activité dialogue" />
</LinearLayout>Langage du code : HTML, XML (xml)

Ajouter des événements de clic aux deux boutons de l’activité principale

package com.foxdevelop.www.lifedemo;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button b = (Button)findViewById(R.id.button);
        b.setOnClickListener(
                new View.OnClickListener(){
                    @Override
                    public void onClick(View view){
                        Intent it = new Intent(MainActivity.this,NormalActivity.class);
                        startActivity(it);
                    }
                }
        );
        Button b2 = (Button)findViewById(R.id.buttondialog);
        b2.setOnClickListener(
                new View.OnClickListener(){
                    @Override
                    public void onClick(View view){
                        Intent it = new Intent(MainActivity.this,DialogActivity.class);
                        startActivity(it);
                    }
                }
        );
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.e(TAG, "onStart: ");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG, "onResume: ");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e(TAG, "onPause: ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.e(TAG, "onStop: ");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e(TAG, "onDestroy: ");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.e(TAG, "onRestart: ");
    }
}Langage du code : JavaScript (javascript)

1. Exécuter l’application

Lors de la création de l’activité principale, onCreate, onStart et onResume sont exécutées dans l’ordre.

Appuyez sur le bouton « Ouvrir l’activité normale », onPause et onStop sont déclenchés.

Comme NormalActivity recouvre entièrement MainActivity, les deux méthodes sont appelées.

Appuyez sur le bouton retour pour revenir en arrière.

Comme MainActivity était à l’état arrêté, onRestart est déclenché, suivi de onStart et onResume.

Notez que onCreate n’est pas appelé car l’activité n’a pas été recréée. À ce moment, NormalActivity a normalement déclenché son propre onDestroy.

Appuyez maintenant sur le bouton « Ouvrir l’activité dialogue ».

Cette fois, seul onPause est déclenché.

Vous remarquerez qu’onStop n’est pas appelé.

C’est parce que DialogActivity ne masque pas complètement MainActivity.

De même, si vous appuyez sur retour à ce moment, seul onResume est exécuté. Comme elle ne s’est pas arrêtée, onStart n’est pas appelé.

Comme vous pouvez le voir, onPause, onStop et onDestroy sont déclenchés ici.

Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.Langage du code : CSS (css)

Activité principale créée → activité dialogue ouverte → retour à l’activité principale → retour à l’écran d’accueil

05-13 02:10:51.635 4206-4206/com.foxdevelop.www.lifedemo E/Activité principale: onCreate: // Nouvelle activité créée
05-13 02:10:51.673 4206-4206/com.foxdevelop.www.lifedemo E/Activité principale: onStart: // De invisible à visible
05-13 02:10:51.701 4206-4206/com.foxdevelop.www.lifedemo E/Activité principale: onResume: // L'activité est visible
05-13 02:12:01.993 4206-4206/com.foxdevelop.www.lifedemo E/Activité principale: onPause: // Départ de l'activité actuelle vers une autre
05-13 02:12:02.115 4206-4206/com.foxdevelop.www.lifedemo E/Activité dialogue: onCreate:
05-13 02:12:02.116 4206-4206/com.foxdevelop.www.lifedemo E/Activité dialogue: onStart:
05-13 02:12:02.143 4206-4206/com.foxdevelop.www.lifedemo E/Activité dialogue: onResume:
05-13 02:14:26.078 4206-4206/com.foxdevelop.www.lifedemo E/Activité dialogue: onPause: // Bouton retour, retour à l'activité principale
05-13 02:14:26.367 4206-4206/com.foxdevelop.www.lifedemo E/Activité principale: onResume: // L'activité principale réapparaît directement car elle n'était pas arrêtée
05-13 02:14:26.803 4206-4206/com.foxdevelop.www.lifedemo E/Activité dialogue: onStop: // L'activité dialogue devient invisible
05-13 02:14:26.803 4206-4206/com.foxdevelop.www.lifedemo E/Activité dialogue: onDestroy: // Retour ou finish() = destruction
05-13 02:16:23.959 4206-4206/com.foxdevelop.www.lifedemo E/Activité principale: onPause:
05-13 02:16:25.606 4206-4206/com.foxdevelop.www.lifedemo E/Activité principale: onStop:
05-13 02:16:25.609 4206-4206/com.foxdevelop.www.lifedemo E/Activité principale: onDestroy: // Avant toute destruction, pause et stop se produisent toujoursLangage du code : JavaScript (javascript)

Le cycle de vie d’une activité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *