6
votes

Android SavedInstancestate Toujours null

J'ai la situation suivante:

  • activité une activité de démarrage B
  • Activité A Appels OnAUSAUSE , OnsaveInstancestate et OnStop Méthodes.
  • sur l'activité B i Appuyez sur la touche "UP" sur la barre d'action
  • Activité Une première est détruite (appels Ondestroy ) puis recréé. (Cela semble juste arriver de cette façon. Je n'ai pas mis en œuvre de cette façon, semble être la façon Android de faire les choses.)
  • pendant la méthode Oncreate , la variable sauvegardestansetate est toujours null.

    Je sais qu'il y a eu des sujets similaires ici, mais aucun d'entre eux ne semble avoir une réponse pour ma situation. Toutes les méthodes de rappel ont des lignes de journalisation. Donc, je suis certain que la méthode de sauvegarde est exécutée et Destory est exécutée. Mais pourquoi n'y a-t-il jamais un objet sauvedInstansetate objet?

    Ma méthode de sauvegarde: xxx

    y a-t-il d'autre code dont vous avez besoin de moi inclure?


0 commentaires

5 Réponses :


7
votes

Appuyez sur up sur la barre d'action n'est en réalité pas la même chose que lorsque vous appuyez sur le bouton Back .

Si vous voulez qu'ils se comportent de la même manière, vous pouvez utiliser ce code dans l'activité B: xxx


4 commentaires

Je vais bien avec la façon dont le bouton fonctionne. Je ne veux tout simplement pas perdre l'état d'activité ..


Ce que je veux dire, c'est que vous appuyiez sur Android de restaurer votre activité. Cela crée une nouvelle. Donnez au code que j'ai posté un essai et voyez s'il fonctionne.


Ainsi, l'utilisation de la fonction intégrée recrée toujours? Peut-être que ce n'est pas complètement ce que je voulais. Votre code fonctionne. Je vais l'utiliser pour l'instant puisqu'il me fait économiser la peine d'essayer d'économiser mon état d'activité. Merci


Oui c'est assez gênant. J'utilise ce code à peu près tout le temps maintenant.



0
votes

Vous devez mettre le

super.onSaveInstanceState(savedInstanceState);


1 commentaires

Cela donne le même résultat.



0
votes

Comme mentionné dans la documentation :

void protégé sur ~SaveInstansetate (bundledstate):

Ne confondez pas cette méthode avec des rappels de cycle de vie d'activité telles que l'onpaause (), qui est toujours appelé lorsqu'une activité est mise en arrière-plan ou sur son chemin vers la destruction, ou sur l'Ontetop () qui est appelée avant la destruction. Un exemple de lorsque l'onpaause () et OnStop () est appelé et non cette méthode est lorsque un utilisateur navigue de l'activité B à l'activité A: Il n'est pas nécessaire d'appeler OnSaveInstanCestate (Bundle) sur B parce que cette instance particulière ne sera jamais restaurée , donc le système évite l'appelant. Un exemple lorsque l'onpaause () est appelé et non OnsaveInstanCestate (Bundle) est lorsque l'activité B est lancée devant l'activité A: Le système peut éviter d'appeler OnsaveInstanCetate (paquet) sur l'activité A si elle n'est pas tuée pendant toute la durée de vie. de B puisque l'état de l'interface utilisateur d'A restera intact.

Si vous faites un changement d'orientation avec votre appareil OnStop () et OnsaveDInstanCestate (...) seront appelés.


2 commentaires

Je connais la documentation. C'est pourquoi je mets les lignes de journalisation là-bas. Et je suis certain que l'onSavedInstancestate est appelée. Si vous utilisez l'onpause () serait toujours une meilleure solution, pourriez-vous alors donner un exemple de comment je peux sauver l'état? Comme il n'y a pas d'objet de paquet ..


Peut-être que OnrestoreInstanCetate (Bundle SavedInstanCetate) sera appelé? Si vous avez des états mondiaux, vous pouvez utiliser SharedPreferences.



9
votes

L'activité supérieure est recréée lors de la navigation. Pour préserver l'état de l'activité A, vous pouvez

a) Définir le mode de lancement de l'activité A à "singletop" (Ajouter Android: LaunleMode = "SingleTop" code> à AndroidManifed.xml) P>

ou p>

b) Ajouter flag_activity_clear_top code> Drapeau sur l'intention code> code> Lorsque vous naviguez à partir de l'activité B: P>

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            Intent up = NavUtils.getParentActivityIntent(this);
            up.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            NavUtils.navigateUpTo(this, up);
            return true;
    }
    return super.onOptionsItemSelected(item);
}


1 commentaires

C'est la réponse que j'ai recherchée pendant des heures!



0
votes

je devais ajouter Android: LaunchMode = "SingleTop" dans la section d'activité de mon fichier manifeste pour que cela fonctionne. Je n'ai alors besoin que

navutils.navigatefromaMaTask (getactivité ())


0 commentaires