onSaveInstanceState () et onRestoreInstanceState ()
Je suis en train de sauvegarder et de restaurer l'état d'un Activity
en utilisant les méthodes onSaveInstanceState()
et onRestoreInstanceState()
.
Le problème est qu'il ne pénètre jamais dans le onRestoreInstanceState()
méthode. Quelqu'un peut-il m'expliquer pourquoi est-ce?
- merci pour le partage du lien...cela a éclairci un peu les choses pour moi +1
- le lien est mort.
Vous devez vous connecter pour publier un commentaire.
Généralement de la restauration de l'état dans
onCreate()
. Il est possible de le restaurer dansonRestoreInstanceState()
, mais n'est pas très commun. (onRestoreInstanceState()
est appelée aprèsonStart()
, alors queonCreate()
est appelé avantonStart()
.Utiliser le placez les méthodes pour stocker des valeurs dans
onSaveInstanceState()
:Et de restaurer les valeurs dans
onCreate()
:Vous n'avez pas à stocker des vues des états, car ils sont stockés
automatiquementpar un appel à super.onSaveInstanceState(icicle);.onRestoreInstanceState
n'a pas besoin d'être utilisé, quand doit-on utiliser?onRestoreInstanceState()
est appelé seulement pour recréer des activité après avoir été tué par le système d'exploitation. Une telle situation se produire lorsque:onRestoreInstanceState()
sera appelée.En revanche: si vous êtes dans votre activité et vous frappez
Back
bouton sur l'appareil, votre activité est fini()ed (c'est à dire penser comme à la sortie de l'application de bureau) et la prochaine fois que vous démarrez votre application, elle est en route "frais", c'est à dire sans état enregistré parce que vous avez quitté il quand vous frappezBack
.Autre source de confusion est que lorsqu'une application perd le focus à une autre application
onSaveInstanceState()
est appelée, mais lorsque vous revenez à votre applicationonRestoreInstanceState()
ne peut pas être appelé. C'est le cas décrit dans la question d'origine, c'est à dire si votre activité n'a PAS été tué au cours de la période au cours de laquelle l'activité a été à l'avantonRestoreInstanceState()
ne sera PAS appelé parce que votre activité est assez bien "vivant".Dans l'ensemble, comme indiqué dans la documentation pour
onRestoreInstanceState()
:Comme je l'ai lu: Il n'y a aucune raison de remplacer
onRestoreInstanceState()
, sauf si vous êtes sous-classementActivity
et il est prévu que quelqu'un va votre sous-classe sous-classe.L'état où vous l'enregistrez au
onSaveInstanceState()
est disponible plus tard auonCreate()
invocation de méthode. Donc, utiliseronCreate
(et sesBundle
paramètre) pour restaurer l'état de votre activité.Comme une solution de contournement, vous pouvez stocker un paquet avec les données que vous souhaitez conserver dans l'Intention que vous utilisez pour démarrer l'activité A.
Activité aurait à passer ce retour à l'Activité B. Vous permettrait de récupérer le but de l'Activité B de la méthode onCreate.
Une autre idée est de créer une classe de référentiel pour stocker de l'activité de l'état et ont chacune de vos activités de référence de la classe (ce qui est possible à l'aide d'un singleton de la structure.) Cependant, c'est probablement le plus d'ennuis que cela vaut la peine.
La chose principale est que si vous ne les stockez pas dans
onSaveInstanceState()
puisonRestoreInstanceState()
ne sera pas appelé. C'est la principale différence entrerestoreInstanceState()
etonCreate()
. Assurez-vous de bien stocker quelque chose. Le plus probable c'est votre problème.J'ai trouvé que onSaveInstanceState est toujours appelée lorsqu'une autre Activité vient à l'avant-plan. Et donc, est onStop.
Cependant, onRestoreInstanceState a été appelé que lorsque onCreate et onStart ont également été appelés. Et, onCreate et de démarrage n'ont PAS toujours été appelé.
Donc il semble que Android n'est pas toujours supprimer les informations d'état, même si l'Activité se déplace vers l'arrière-plan. Toutefois, il appelle le cycle de vie de méthodes pour économiser de l'état juste pour être sûr. Ainsi, si l'état n'est pas supprimé, puis Android n'a pas d'appeler le cycle de vie des méthodes de restauration de l'état comme ils ne sont pas nécessaires.
La Figure 2 explique cette.
Je pense que ce fil était assez vieux. Je viens de vous parler d'un autre cas, que
onSaveInstanceState()
sera également appelé, est lorsque vous appelezActivity.moveTaskToBack(boolean nonRootActivity)
.Si vous êtes à la manipulation de l'activité de changements d'orientation avec
android:configChanges="orientation|screenSize"
etonConfigurationChanged(Configuration newConfig)
,onRestoreInstanceState()
ne sera pas appelé.Il n'est pas nécessaire que onRestoreInstanceState sera toujours appelé après onSaveInstanceState.
Noter que :
onRestoreInstanceState sera toujours, quand l'activité est tourné (lorsque l'orientation n'est pas traitée) ou ouvrez votre activité et d'ouvrir d'autres applications, de sorte que votre activité instance est effacé de la mémoire par le système d'exploitation.
Dans mon cas,
onRestoreInstanceState
a été appelée lorsque l'activité a été reconstruit après la modification de l'orientation du périphérique.onCreate(Bundle)
a été appelé en premier, mais le bundle n'ai pas les clés/valeurs j'ai mis aveconSaveInstanceState(Bundle)
.Juste après,
onRestoreInstanceState(Bundle)
a été appelé avec un bundle qui possédaient les clés/valeurs.Je viens de tomber sur ce et a remarqué que la documentation eu ma réponse:
"Cette fonction ne sera jamais appelée avec une valeur null état."
https://developer.android.com/reference/android/view/View.html#onRestoreInstanceState(android.os.Parcelable)
Dans mon cas, je me demandais pourquoi le onRestoreInstanceState n'était pas d'être appelé initiale de l'instanciation. Cela signifie également que si vous n'avez pas stocker quoi que ce soit, il ne sera pas appelé quand vous allez pour reconstruire votre point de vue.
Je peux faire comme ça (désolé c'est c# pas java, mais ce n'est pas un problème...) :
ET DANS VOTRE ACTIVITÉ POUR LE RÉSULTAT
ENFIN