What's onCreate (Bundle savedInstanceState)

122

Quelqu'un peut-il m'aider à connaître le Bundle savedInstanceStatedans onCreate(Bundle savedInstanceState)Je suis novice dans Android. J'essaie de le comprendre à partir de developer.android.com. Mais je ne peux pas comprendre. Quelqu'un peut-il le simplifier?

utilisateur1077015
la source
2
C'est une bonne vidéo: youtube.com/watch?v=kkYIMZw9gzQ
Francisco Corrales Morales

Réponses:

106

Si vous enregistrez l'état de l'application dans un bundle (généralement des données dynamiques non persistantes dans onSaveInstanceState), il peut être renvoyé à onCreatesi l'activité doit être recréée (par exemple, changement d'orientation) afin que vous ne perdiez pas cela avant information. Si aucune donnée n'a été fournie, la valeur savedInstanceStateest nulle.

... vous devez utiliser la méthode onPause () pour écrire toutes les données persistantes (telles que les modifications utilisateur) dans le stockage. De plus, la méthode onSaveInstanceState (Bundle) est appelée avant de placer l'activité dans un tel état d'arrière-plan, ce qui vous permet d'enregistrer tout état d'instance dynamique de votre activité dans le Bundle donné, pour être reçu ultérieurement dans onCreate (Bundle) si l'activité doit être recréé. Consultez la section Cycle de vie des processus pour plus d'informations sur la manière dont le cycle de vie d'un processus est lié aux activités qu'il héberge. Notez qu'il est important de sauvegarder les données persistantes dans onPause () au lieu de onSaveInstanceState (Bundle) car ce dernier ne fait pas partie des rappels du cycle de vie, donc ne sera pas appelé dans toutes les situations comme décrit dans sa documentation.

la source

Dhruv Gairola
la source
2
les autres activités partagent-elles le même Bundle?
Francisco Corrales Morales
17

onCreate(Bundle savedInstanceState)vous obtiendrez la valeur Bundlenulle lorsque l'activité démarrera pour la première fois et elle sera utilisée lorsque l'orientation de l'activité sera modifiée .......

http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

Android offre un autre moyen élégant d'y parvenir. Pour y parvenir, nous devons remplacer une méthode appelée onSaveInstanceState(). La plate-forme Android permet aux utilisateurs de sauvegarder n'importe quel état d'instance. L'état de l'instance peut être enregistré dans le bundle. Le bundle est passé comme argument à la méthode onSaveInstanceState.

nous pouvons charger l'état d'instance sauvegardé à partir du Bundle passé en argument à la onCreateméthode. Nous pouvons également charger l'état de l'instance sauvegardé dans onRestoreInstanceStatemethod. Mais je laisserai cela aux lecteurs pour comprendre.

Dheeresh Singh
la source
11
savedInstanceStatesera non- nullsi a onSavedInstanceState()été précédemment appelé. les changements d'orientation ne sont qu'un exemple dans lequel cela pourrait se produire.
Alex Lockwood
1
@AlexLockwood, j'essaie de penser à toutes les situations où cela pourrait se produire. Y a-t-il de la documentation? Un exemple auquel je peux penser est si l'utilisateur change d'application et revient, mais l'activité a été détruite pour récupérer des ressources. Dans ce cas, Android recréera l'activité avec un bundle si onSaveInsanceState () a été remplacé, non?
batbrat
1
@batbrat Oui ... le commentaire que j'ai fait (il y a presque deux ans) n'est pas entièrement correct. Je suppose que la meilleure façon de le dire est que l' Bundleargument onCreate(Bundle)sera non- nullsi et seulement si la méthode Activityavait sa onSaveInstanceStateméthode précédemment appelée. Cela se produit pendant les changements d'orientation ... et se produit également lorsque l'activité revient après avoir été tuée par le système d'exploitation, et lorsque vous déclenchez tout autre changement de configuration d'intérêt sur votre appareil.
Alex Lockwood
Merci pour la clarification Alex. Il est bon d'avoir une certaine clarté sur le sujet. J'avais oublié les changements de configuration autres que les commutateurs d'orientation en particulier.
batbrat
15

Comme Dhruv Gairola a répondu, vous pouvez enregistrer l'état de l'application en utilisant Bundle savedInstanceState. J'essaie de donner un exemple très simple que les nouveaux apprenants comme moi peuvent comprendre facilement.

Supposons que vous ayez un simple fragment avec un TextView et un Button. Chaque fois que vous cliquez sur le bouton, le texte change. Maintenant, changez l'orientation de votre appareil / émulateur et notez que vous avez perdu les données (signifie les données modifiées après avoir cliqué sur vous) et que le fragment recommence comme la première fois. En utilisant Bundle savedInstanceState, nous pouvons nous en débarrasser. Si vous jetez un œil au cycle de vie du fragment. Fragment Lifecylce vous obtiendrez qu'une méthode "onSaveInstanceState" est appelée lorsque le fragment est sur le point d'être détruit.

Ainsi, nous pouvons enregistrer l'état signifie la valeur de texte modifiée dans cet ensemble comme ceci

 int counter  = 0;
 @Override
 public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("value",counter);
 }

Après avoir fait l'orientation, la méthode "onCreate" sera appelée, non? donc on peut juste faire ça

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState == null){
        //it is the first time the fragment is being called
        counter = 0;
    }else{
        //not the first time so we will check SavedInstanceState bundle
        counter = savedInstanceState.getInt("value",0); //here zero is the default value
    }
}

Maintenant, vous ne perdrez pas votre valeur après l'orientation. La valeur modifiée sera toujours affichée.

Asad
la source
Notez que cela est également vrai pour l'activité. Pouvez-vous expliquer plus en détail la différence entre (Bundle of Activity) et Bundle of Fragment?
laalaguer
Vous pouvez obtenir une compréhension claire des cycles de vie de l'activité et du fragment où une activité peut afficher plusieurs fragments à la fois.Ainsi, la différence fondamentale est que vous voudrez peut-être enregistrer certaines valeurs pour tous les fragments d'une activité, alors vous allez utilisez le paquet d'activité sinon vous devriez utiliser le paquet de fragment s'il s'agit d'un fragment spécifique.
Asad
5

Fonction onCreate (Bundle savedInstanceState) sous Android:

1) Lors du premier appel ou du lancement d'une activité, la méthode onCreate (Bundle savedInstanceState) est responsable de la création de l'activité.

2) Chaque fois que l'orientation (c'est-à-dire de l'horizontale à la verticale ou verticale à l'horizontale) de l'activité est modifiée ou lorsqu'une activité est interrompue de force par un système d'exploitation, alors saveInstanceState, c'est-à-dire que l'objet de la classe Bundle enregistrera l'état d'une activité.

3) Une fois l'orientation modifiée, onCreate (Bundle savedInstanceState) appellera et recréera l'activité et chargera toutes les données de savedInstanceState.

4) Fondamentalement, la classe Bundle est utilisée pour stocker les données d'activité chaque fois que la condition ci-dessus se produit dans l'application.

5) onCreate () n'est pas requis pour les applications. Mais la raison pour laquelle elle est utilisée dans l'application est que cette méthode est le meilleur endroit pour mettre le code d'initialisation.

6) Vous pouvez également mettre votre code d'initialisation dans onStart () ou onResume () et lorsque votre application se chargera en premier, cela fonctionnera de la même manière que dans onCreate ().

Abhi
la source
4

onCreate(Bundle)est appelée lorsque l'activité démarre. Vous pouvez l'utiliser pour effectuer une initialisation unique telle que la création de l'interface utilisateur. onCreate()prend un paramètre qui est nul ou des informations d'état précédemment enregistrées par le onSaveInstanceState.

psxls
la source
0

onCreate (Bundle savedInstanceState) est appelé et savedInstanceState sera non nul si votre activité et qu'elle s'est terminée dans un scénario (vue visuelle) décrit ci-dessus. Votre application peut ensuite récupérer (attraper) les données de savedInstanceState et régénérer votre activité

kabilan
la source