142 votes

onSaveInstanceState () et onRestoreInstanceState ()

J’essaie d’enregistrer et de restaurer l’état d’un en utilisant les méthodes et `` .

Le problème est qu’il n’entre jamais le `` méthode. Quelqu'un peut-il expliquer à moi pourquoi il en est ?

194voto

Robert Points 3903

Habituellement, vous devez restaurer votre état en onCreate(). Il est possible de le restaurer en onRestoreInstanceState() , mais n'est pas très commun. (onRestoreInstanceState() est appelée après l' onStart(), alors que onCreate() avant onStart().

Utiliser le placez les méthodes pour stocker des valeurs en onSaveInstanceState():

protected void onSaveInstanceState(Bundle icicle) {
  super.onSaveInstanceState(icicle);
  icicle.putLong("param", value);
}

Et de restaurer les valeurs en onCreate():

public void onCreate(Bundle icicle) {
  if (icicle != null){
    value = icicle.getLong("param");
  }
}

Vous n'avez pas à stocker des vues des états, car ils sont stockés automatiquement.

153voto

Ogre_BGR Points 4799

onRestoreInstanceState() est appelé seulement pour recréer de l'activité après qu'il a été tué par le système d'exploitation. Une telle situation se produire lorsque:

  • l'orientation de l'appareil changements (votre activité est détruit et recréé)
  • il y a une autre activité en face de la vôtre et à un certain point, le système d'exploitation tue votre activité afin de libérer de la mémoire (par exemple). La prochaine fois quand vous démarrez votre activité 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 frappez Back.

Autre source de confusion est que lorsqu'une application perd le focus à une autre application onSaveInstanceState() est appelée, mais lorsque vous revenez à votre application onRestoreInstanceState() 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'avant onRestoreInstanceState() ne sera PAS appelé parce que votre activité est assez bien "vivant".

Dans l'ensemble, comme indiqué dans la documentation pour l' onRestoreInstanceState():

La plupart des implémentations seront tout simplement utiliser onCreate(Bundle) pour restaurer leur de l'état, mais il est parfois commode de le faire ici, après tout, de la l'initialisation a été fait, ou pour permettre à des sous-classes pour décider si pour utiliser votre défaut de mise en œuvre. L'implémentation par défaut de cette méthode effectue une restauration de vue de l'état qui avait été précédemment gelé par onSaveInstanceState(Bundle).

Comme je l'ai lu: Il n'y a aucune raison de remplacer onRestoreInstanceState() , sauf si vous êtes sous-classement Activity et il est prévu que quelqu'un va votre sous-classe sous-classe.

8voto

Konstantin Burov Points 34011

L’état vous enregistrer à n’est plus tard disponible au appel de la méthode. Donc utiliser (et ses paramètre) pour restaurer l’état de votre activité.

3voto

user1771286 Points 41

L’essentiel est que si vous ne stockez dans puis ne sera pas appelée. Il s’agit de la principale différence entre et . Assurez-vous que vous stockez réellement quelque chose. Très probablement, c’est votre problème.

2voto

macio.Jun Points 1857

Je pense que ce fil était assez vieux. J’ai juste mentionner une autre affaire, qui s’appellera également, lorsque vous appelez .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X