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 :
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 :
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 :
Toutefois, lorsque nous faisons pivoter l’appareil en mode paysage, ce nombre est perdu :
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é !
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.