Partager via


Procédure pas à pas : enregistrement de l’état de l’activité

Nous avons abordé la théorie de l’économie de l’état dans le guide du cycle de vie de l’activité ; maintenant, passons en revue un exemple.

Procédure pas à pas de l’état de l’activité

Nous allons ouvrir le projet ActivityLifecycle_Start , le générer et l’exécuter. Il s’agit d’un projet très simple qui a deux activités pour illustrer le cycle de vie des activités et comment les différentes méthodes de cycle de vie sont appelées. Lorsque vous démarrez l’application, l’écran de MainActivity l’application s’affiche :

Écran Activité A

Affichage des transitions d’état

Chaque méthode de cet exemple écrit dans la fenêtre de sortie de l’application IDE pour indiquer l’état de l’activité. (Pour ouvrir la fenêtre de sortie dans Visual Studio, tapez Ctrl-Alt-O ; pour ouvrir la fenêtre de sortie dans Visual Studio pour Mac, cliquez sur Afficher > la sortie de l’application Des pavés>.)

Lorsque l’application démarre pour la première fois, la fenêtre de sortie affiche les modifications d’état de l’activité A :

[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume

Lorsque nous cliquez sur le bouton Démarrer l’activité B , nous voyons l’activité A suspendre et arrêter pendant que l’activité B passe par ses modifications d’état :

[ActivityLifecycle.MainActivity] Activity A - OnPause
[ActivityLifecycle.SecondActivity] Activity B - OnCreate
[ActivityLifecycle.SecondActivity] Activity B - OnStart
[ActivityLifecycle.SecondActivity] Activity B - OnResume
[ActivityLifecycle.MainActivity] Activity A - OnStop

Par conséquent, l’activité B est démarrée et affichée à la place de l’activité A :

Écran Activité B

Lorsque nous cliquez sur le bouton Précédent , l’activité B est détruite et l’activité A reprend :

[ActivityLifecycle.SecondActivity] Activity B - OnPause
[ActivityLifecycle.MainActivity] Activity A - OnRestart
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume
[ActivityLifecycle.SecondActivity] Activity B - OnStop
[ActivityLifecycle.SecondActivity] Activity B - OnDestroy

Ajout d’un compteur de clic

Ensuite, nous allons modifier l’application afin que nous disposions d’un bouton qui compte et affiche le nombre de fois où il est cliqué. Tout d’abord, ajoutons une variable d’instance _counter à MainActivity:

int _counter = 0;

Ensuite, nous allons modifier le fichier de disposition Resource/layout/Main.axml et ajouter un nouveau clickButton qui affiche le nombre de fois où l’utilisateur a cliqué sur le bouton. Le main.axml résultant doit ressembler à ce qui suit :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
        android:id="@+id/myButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/mybutton_text" />
    <Button
        android:id="@+id/clickButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/counterbutton_text" />
</LinearLayout>

Ajoutons le code suivant à la fin de la méthode OnCreate dans MainActivity : ce code gère les événements de clic à partir des clickButtonéléments suivants :

var clickbutton = FindViewById<Button> (Resource.Id.clickButton);
clickbutton.Text = Resources.GetString (
    Resource.String.counterbutton_text, _counter);
clickbutton.Click += (object sender, System.EventArgs e) =>
{
    _counter++;
    clickbutton.Text = Resources.GetString (
        Resource.String.counterbutton_text, _counter);
} ;

Lorsque nous créons et réexécutons l’application, un nouveau bouton s’affiche et affiche la valeur de _counter chaque clic :

Ajouter un nombre d’interactions tactiles

Toutefois, lorsque nous faisons pivoter l’appareil en mode paysage, ce nombre est perdu :

La rotation vers le paysage rétablit le nombre à zéro

En examinant la sortie de l’application, nous voyons que l’activité A a été suspendue, arrêtée, détruite, recréée, redémarrée, puis reprise pendant la rotation du portrait en mode paysage :

[ActivityLifecycle.MainActivity] Activity A - OnPause
[ActivityLifecycle.MainActivity] Activity A - OnStop
[ActivityLifecycle.MainActivity] Activity A - On Destroy

[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume

Étant donné que l’activité A est détruite et recréée lorsque l’appareil est pivoté, son état d’instance est perdu. Ensuite, nous allons ajouter du code pour enregistrer et restaurer l’état de l’instance.

Ajout de code pour conserver l’état de l’instance

Ajoutons une méthode pour MainActivity enregistrer l’état de l’instance. Avant la destruction de l’activité A , Android appelle automatiquement OnSaveInstanceState et passe un bundle que nous pouvons utiliser pour stocker l’état de notre instance. Nous allons l’utiliser pour enregistrer notre nombre de clics sous forme de valeur entière :

protected override void OnSaveInstanceState (Bundle outState)
{
    outState.PutInt ("click_count", _counter);
    Log.Debug(GetType().FullName, "Activity A - Saving instance state");

    // always call the base implementation!
    base.OnSaveInstanceState (outState);    
}

Lorsque l’activité A est recréée et reprise, Android le transmet Bundle à notre OnCreate méthode. Ajoutons du code pour OnCreate restaurer la _counter valeur à partir du passage Bundle. Ajoutez le code suivant juste avant la ligne où clickbutton est définie :

if (bundle != null)
{
    _counter = bundle.GetInt ("click_count", 0);
    Log.Debug(GetType().FullName, "Activity A - Recovered instance state");
}

Générez et réexécutez l’application, puis cliquez sur le deuxième bouton quelques fois. Lorsque nous faisons pivoter l’appareil en mode paysage, le nombre est conservé !

La rotation de l’écran affiche le nombre de quatre conservés

Examinons la fenêtre de sortie pour voir ce qui s’est passé :

[ActivityLifecycle.MainActivity] Activity A - OnPause
[ActivityLifecycle.MainActivity] Activity A - Saving instance state
[ActivityLifecycle.MainActivity] Activity A - OnStop
[ActivityLifecycle.MainActivity] Activity A - On Destroy

[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - Recovered instance state
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume

Avant l’appel de la méthode OnStop , notre nouvelle OnSaveInstanceState méthode a été appelée pour enregistrer la _counter valeur dans un Bundle. Android nous a transmis ce Bundle retour quand il a appelé notre OnCreate méthode, et nous avons pu l’utiliser pour restaurer la _counter valeur à l’endroit où nous avons quitté.

Résumé

Dans cette procédure pas à pas, nous avons utilisé notre connaissance du cycle de vie de l’activité pour préserver les données d’état.