J'essaie de sauvegarder et de restaurer l'état d'un en Activity
utilisant les méthodes onSaveInstanceState()
et onRestoreInstanceState()
.
Le problème est qu'il n'entre jamais dans la onRestoreInstanceState()
méthode. Quelqu'un peut-il m'expliquer pourquoi?
android
android-activity
states
BlaBRA
la source
la source
Réponses:
Habituellement, vous restaurez votre état dans
onCreate()
. Il est possible de le restaureronRestoreInstanceState()
également, mais ce n'est pas très courant. (onRestoreInstanceState()
s'appelle aprèsonStart()
, alors queonCreate()
s'appelle avantonStart()
.Utilisez les méthodes put pour stocker les valeurs dans
onSaveInstanceState()
:Et restaurez les valeurs dans
onCreate()
:la source
onRestoreInstanceState()
est appelée uniquement lors de la recréation d'une activité après sa suppression par le système d'exploitation. Une telle situation se produit lorsque:En revanche: si vous êtes dans votre activité et que vous appuyez
Back
sur le bouton de l'appareil, votre activité est terminée () ed (c'est-à-dire que vous la considérez comme une application de bureau sortante) et la prochaine fois que vous démarrez votre application, elle est lancée "à neuf", c'est-à-dire sans état enregistré parce que vous l'avez quitté intentionnellement lorsque vous avez frappéBack
.Une autre source de confusion est que lorsqu'une application perd le focus sur une autre application
onSaveInstanceState()
est appelée, mais lorsque vous revenez à votre application, elleonRestoreInstanceState()
peut ne pas être appelée. C'est le cas décrit dans la question initiale, c'est-à-dire si votre activité n'a PAS été tuée pendant la période où une autre activité était en avantonRestoreInstanceState()
, ne sera PAS appelée car votre activité est quasiment "vivante".Dans l'ensemble, comme indiqué dans la documentation pour
onRestoreInstanceState()
:Tel que je l'ai lu: Il n'y a aucune raison de passer outre à
onRestoreInstanceState()
moins que vous ne sous-classiezActivity
et que l'on s'attende à ce que quelqu'un sous-classe votre sous-classe.la source
L'état dans lequel vous enregistrez
onSaveInstanceState()
est disponible ultérieurement lors de l'onCreate()
appel de méthode. Utilisez donconCreate
(et sonBundle
paramètre) pour restaurer l'état de votre activité.la source
Pour contourner ce problème, vous pouvez stocker un ensemble avec les données que vous souhaitez conserver dans l'intention que vous utilisez pour démarrer l'activité A.
L'activité A devrait le renvoyer à l'activité B. Vous récupéreriez l'intention dans la méthode onCreate de l'activité B.
Une autre idée est de créer une classe de référentiel pour stocker l'état de l'activité et que chacune de vos activités fasse référence à cette classe (possible en utilisant une structure singleton.) Cependant, cela pose probablement plus de problèmes que cela ne vaut la peine.
la source
La chose principale est que si vous ne stockez pas
onSaveInstanceState()
alorsonRestoreInstanceState()
ne sera pas appelé. C'est la principale différence entrerestoreInstanceState()
etonCreate()
. Assurez-vous de vraiment stocker quelque chose. C'est probablement votre problème.la source
J'ai trouvé que onSaveInstanceState est toujours appelé lorsqu'une autre activité vient au premier plan. Et est donc onStop.
Cependant, onRestoreInstanceState était appelé uniquement lorsque onCreate et onStart étaient également appelés. Et, onCreate et onStart n'étaient PAS toujours appelés.
Il semble donc qu'Android ne supprime pas toujours les informations d'état, même si l'activité passe à l'arrière-plan. Cependant, il appelle les méthodes du cycle de vie pour enregistrer l'état juste pour être sûr. Ainsi, si l'état n'est pas supprimé, Android n'appelle pas les méthodes du cycle de vie pour restaurer l'état car elles ne sont pas nécessaires.
La figure 2 décrit cela.
la source
Je pense que ce fil était assez ancien. Je viens de mentionner un autre cas, qui
onSaveInstanceState()
sera également appelé, c'est lorsque vous appelezActivity.moveTaskToBack(boolean nonRootActivity)
.la source
Si vous gérez les changements d'orientation de l'activité avec
android:configChanges="orientation|screenSize"
etonConfigurationChanged(Configuration newConfig)
,onRestoreInstanceState()
ne sera pas appelé.la source
Il n'est pas nécessaire que onRestoreInstanceState soit toujours appelé après onSaveInstanceState.
Notez que: onRestoreInstanceState sera toujours appelé, lorsque l'activité est pivotée (lorsque l'orientation n'est pas gérée) ou ouvrez votre activité, puis ouvrez d'autres applications afin que votre instance d'activité soit effacée de la mémoire par le système d'exploitation.
la source
Dans la documentation, restaurer l'état de l'interface utilisateur de l'activité à l'aide de l'état d'instance enregistré, il est indiqué comme suit:
OMI, c'est un moyen plus clair que de vérifier cela sur onCreate, et correspond mieux au principe de responsabilité unique.
la source
Dans mon cas, a
onRestoreInstanceState
été appelé lorsque l'activité a été reconstruite après avoir changé l'orientation de l'appareil.onCreate(Bundle)
a été appelé en premier, mais le bundle ne contenait pas les clés / valeurs que j'ai définiesonSaveInstanceState(Bundle)
.Juste après, a
onRestoreInstanceState(Bundle)
été appelé avec un bundle qui avait les bonnes clés / valeurs.la source
Je viens de rencontrer ceci et j'ai remarqué que la documentation avait ma réponse:
"Cette fonction ne sera jamais appelée avec un état nul."
https://developer.android.com/reference/android/view/View.html#onRestoreInstanceState(android.os.Parcelable)
Dans mon cas, je me demandais pourquoi onRestoreInstanceState n'était pas appelé lors de l'instanciation initiale. Cela signifie également que si vous ne stockez rien, il ne sera pas appelé lorsque vous reconstruirez votre vue.
la source
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
la source