Que sauver et quoi ne pas faire?
Vous êtes-vous déjà demandé pourquoi le texte du EditText
fichier est enregistré automatiquement lors d'un changement d'orientation? Eh bien, cette réponse est pour vous.
Lorsqu'une instance d'une activité est détruite et que le système recrée une nouvelle instance (par exemple, un changement de configuration). Il essaie de le recréer à l'aide d'un ensemble de données enregistrées de l'ancien état d'activité ( état d'instance ).
L'état d'instance est une collection de paires clé-valeur stockées dans un Bundle
objet.
Par défaut, System enregistre les objets View dans le Bundle par exemple.
- Texte en
EditText
- Position de défilement dans a
ListView
, etc.
Si vous avez besoin d'une autre variable à enregistrer en tant que partie de l'état d'instance, vous devez remplacer onSavedInstanceState(Bundle savedinstaneState)
méthode.
Par exemple, int currentScore
dans une GameActivity
Plus de détails sur onSavedInstanceState (Bundle savedinstaneState) lors de l'enregistrement des données
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
Donc, par erreur, si vous oubliez d'appeler,
super.onSaveInstanceState(savedInstanceState);
le comportement par défaut ne fonctionnera pas, c'est-à-dire que le texte dans EditText ne sera pas enregistré.
Lequel choisir pour restaurer l'état de l'activité?
onCreate(Bundle savedInstanceState)
OU
onRestoreInstanceState(Bundle savedInstanceState)
Les deux méthodes obtiennent le même objet Bundle, donc peu importe où vous écrivez votre logique de restauration. La seule différence est que dans la onCreate(Bundle savedInstanceState)
méthode, vous devrez donner une vérification nulle alors qu'elle n'est pas nécessaire dans ce dernier cas. D'autres réponses ont déjà des extraits de code. Vous pouvez les référer.
Plus de détails sur onRestoreInstanceState (Bundle savedinstaneState)
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from the saved instance
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
}
Appelez toujours super.onRestoreInstanceState(savedInstanceState);
pour que le système restaure la hiérarchie des vues par défaut
Prime
Le onSaveInstanceState(Bundle savedInstanceState)
n'est invoqué par le système que lorsque l'utilisateur a l'intention de revenir à l'activité. Par exemple, vous utilisez App X et vous recevez soudainement un appel. Vous passez à l'application appelant et revenez à l'application X. Dans ce cas, leonSaveInstanceState(Bundle savedInstanceState)
méthode sera invoquée.
Mais considérez ceci si un utilisateur appuie sur le bouton de retour. Il est supposé que l'utilisateur n'a pas l'intention de revenir à l'activité, dans ce cas, onSaveInstanceState(Bundle savedInstanceState)
il ne sera pas invoqué par le système. Il est important de considérer tous les scénarios lors de la sauvegarde des données.
Liens pertinents:
Démo sur le comportement par défaut
Android Official Documentation .