L'environnement mobile est très dynamique, les utilisateurs changeant de tâches beaucoup plus souvent que sur les ordinateurs de bureau. Avec généralement moins de ressources sur un appareil mobile, il est à prévoir que votre application sera interrompue à un moment donné. Il est également très possible que le système arrête complètement votre application pour donner des ressources supplémentaires à la tâche en cours. C'est la nature des mobiles.
-D ±}
Un utilisateur pourrait commencer à taper quelque chose dans votre application, être interrompu par un appel téléphonique, ou passer à une autre application pour envoyer un message texte, et au moment où ils reviennent à votre application, le système peut l'avoir complètement fermé pour libérer jusqu'à la mémoire. Pour offrir la meilleure expérience utilisateur, vous devez vous attendre à un tel comportement et le rendre plus facile à reprendre par votre utilisateur. La bonne chose est que le système d'exploitation Android rend cela plus facile en fournissant des rappels pour informer votre application des changements d'état.
Si vous faites simplement pivoter votre appareil, le système d'exploitation va détruire et recréer votre activité. Cela peut sembler un peu sévère, mais c'est fait pour de bonnes raisons - il est très courant d'avoir différentes mises en page pour le portrait et le paysage, donc cela garantit que votre application utilise les bonnes ressources.
Dans cette recette, vous verrez comment gérer les rappels onSavelnstanceState () et onRestorelnstanceState () pour sauvegarder l'état de votre application. Nous allons le démontrer en créant une variable de compteur et en l'incrémentant chaque fois que l'on appuie sur le bouton Count. Nous aurons aussi un EditText et un widget TextView pour voir leur comportement par défaut.


Se préparer
Créez un nouveau projet dans Android Studio et nommez-le stateSaver. Nous n'avons besoin que d'une seule activité, donc l'activité principale autogénérée est suffisante. Cependant, nous aurons besoin de quelques widgets, y compris EditText, Button et TextView. Leur mise en page (dans activity_main.xml) ressemblera à ceci:
<EditText
android: id = "@ + id / editText"
android: layout_width = "match_parent"
android: layout_height = "wrap_content"
android: layout_alignParentTop = "vrai"
android: layout_alignParentStart = "vrai" />
<Bouton
android: id = "@ + id / bouton"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_centerInParent = "vrai"
android: text = "Compte"
android: onClick = "onClickCounter" />
<TextView
android: id = "@ + id / textViewCounter"
OE-

android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_below = "@ id / bouton" />

 

Comment faire...
Effectuez les étapes suivantes:
1. Pour garder une trace du compteur, nous devons ajouter une variable globale au projet, avec une clé pour sauvegarder et restaurer. Ajoutez le code suivant à MainActivity. classe Java:
static final String KEY_COUNTER = "COUNTER"; int int mCounter = 0;
2. Ensuite, ajoutez le code nécessaire pour gérer le bouton; il incrémente le compteur et affiche le résultat dans le widget TextView:
public void onClickCounter (Voir la vue) {mCounter ++;
((TextView) findViewById (R.id.textViewCounter)). SetText ("Compteur:" + Integer.toString (mCounter));
}
3. Pour recevoir des notifications de changement d'état de l'application, nous devons ajouter
Méthodes onSaveInstanceState () et onRestoreInstanceState () à notre application. Ouvrez MainActivity.java et ajoutez ce qui suit:
@Passer outre
void protégé onSaveInstanceState (Bundle outState) {super.onSaveInstanceState (outState); outState.putInt (KEY_COUNTER, mCounter);
}
@Passer outre
void protégé onRestoreInstanceState (Bundle savedInstanceState) {super.onRestoreInstanceState (savedInstanceState); mCounter = savedInstanceState.getInt (KEY_COUNTER);
}
4. Exécutez le programme et essayez de changer l'orientation pour voir comment elle se comporte (si vous utilisez l'émulateur, Ctrl + F11 fera pivoter l'appareil).


Comment ça marche...
Toutes les activités passent par plusieurs états au cours de leur vie. En configurant des rappels pour gérer les événements, notre code peut enregistrer des informations importantes avant que l'activité ne soit détruite.
L'étape 3 est l'endroit où la sauvegarde et la restauration se produisent réellement. Le système envoie un bundle (un objet de données qui utilise également des paires nom / valeur) aux méthodes. Nous utilisons le rappel onSavelnstanceState () pour sauvegarder les données et les retirer dans le
OnRestoreInstanceState () callback.
Mais attendez! Avez-vous essayé de taper du texte dans la vue EditText avant de faire pivoter l'appareil? Si c'est le cas, vous avez remarqué que le texte a également été restauré, mais nous n'avons aucun code pour gérer cette vue. Par défaut, le système sauvegardera automatiquement l'état, à condition qu'il ait un identifiant unique (toutes les vues n'ont pas automatiquement leur état sauvegardé, tel que le Textview, mais nous pouvons le sauvegarder manuellement si nous le voulons).
Notez que si vous voulez qu'Android sauvegarde et restaure automatiquement l'état d'une vue, il doit avoir un identifiant unique (spécifié avec l'attribut android: id = dans la mise en page). Il faut se méfier; Tous les types de vue ne sont pas automatiquement enregistrés et restaurent l'état d'une vue.


Il y a plus...
Le rappel onRestoreInstanceState () n'est pas le seul endroit où l'état peut être restauré. Regardez la signature de onCreate ():
onCreate (Bundle savedInstanceState)
Les deux méthodes reçoivent la même instance de bundle nommée savedInstanceState. Vous pouvez déplacer le code de restauration vers la méthode onCreate () et cela fonctionnera de la même manière.
Mais un attrape est que le bundle savedInstanceState sera nul s'il n'y a pas de données, comme lors de la création initiale de l'activité. Si vous souhaitez déplacer le code depuis le rappel onRestoreInstanceState (), vérifiez que les données ne sont pas nulles, comme suit:
if (savedInstanceState! = null) {
mCounter = savedInstanceState.getInt (KEY_COUNTER);
}
Voir également
► La recette de stockage des données d'activité persistante introduira un stockage persistant.
► Jetez un œil au chapitre 6, Travailler avec des données, pour plus d'exemples sur les activités Android.
► La recette Comprendre le cycle de vie de l'activité explique le cycle de vie de l'activité Android.
m-