2013-03-12 38 views
30

Sorry für mein Unverständnis, aber ich bin neu in der Android-Entwicklung.Wann wird onRestoreInstanceState aufgerufen?

Ich habe eine Anwendung mit Aktivität A und Aktivität B darin, und ich gehe von Aktivität A zu Aktivität B. Wenn ich Aktivität A verließ, wurde die onSaveInstanceState Methode aufgerufen, aber wenn ich zurück zu Aktivität A (von Aktivität B in der gleichen Anwendung), das Bündel in der onCreate Methode war null.

Was kann ich tun, um den vorherigen Status von Aktivität A zu speichern? Ich möchte nur die Daten für die Anwendungslebensdauer speichern.

Kann mir jemand dabei helfen?

Hier ist mein Code für A Aktivität:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if (savedInstanceState != null) 
    { 
     Log.v("Main", savedInstanceState.getString("test")); 
    } 
    else 
    { 
     Log.v("Main", "old instance"); 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) 
{ 
    Log.v("Main", "save instance"); 

    savedInstanceState.putString("test", "my test string"); 

    super.onSaveInstanceState(savedInstanceState); 
} 


public void buttonClick(View view) 
{ 
    Intent intent = new Intent(this, Activity2.class); 
    startActivity(intent); 
} 

Hier ist mein Code für Aktivität B ist, wenn ich eine Taste drücken, um Aktivität A zurück zu gehen:

public void onBack(View view) 
{ 
    NavUtils.navigateUpFromSameTask(this); 
} 
+0

poste deinen Code und lass sehen, wie du das Bündel speicherst. – Triode

+1

überprüfen Sie http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle) – Nermeen

+2

möglich duplizieren von http://StackOverflow.com/questions/6554317/savedinstancestate-is- immer null – npace

Antwort

21

Speichern und Wiederherstellen Zustand soll die aktuellen temporären Daten speichern, die veraltet sind, wenn der Benutzer die Anwendung beendet. Wenn Sie die Aktivität minimieren oder verlassen, indem Sie die nächste öffnen, wird sie vom System möglicherweise aufgrund von Ressourcenmangel abgebrochen und mit savedInstanceState neu gestartet, wenn Sie darauf zurückkommen. Verwenden Sie daher onSaveInstanceState() nur zum Speichern von Sitzungsdaten für die Minimierung der Wiederherstellung.

Wenn Sie also eine neue Aktivität starten und zur vorherigen zurückkehren (was Sie gerade versuchen), wird die Aktivität A möglicherweise nicht beendet (nur gestoppt) und neu gestartet, ohne zerstört zu werden. Sie können das Beenden und Wiederherstellen erzwingen, indem Sie im Entwickleroptionen-Menü Don't keep activities auswählen.

Wenn Sie finish() rufen oder die Activity aus den letzten Aufgabenliste entfernen die savedInstanceState nicht an onCreate() weitergegeben werden, da die Aufgabe gelöscht wurde.

Wenn der Wert hartnäckig sein muss mit berücksichtigen SharedPreferences.

+0

1. Ich habe versucht, nichts geändert, 2.Wenn Aktivität A möglicherweise nicht neu gestartet wird, sollte ich diese Protokollmeldung erhalten: Log.v ("Main", "alte Instanz")? –

+1

Was ich sage ist, dass wenn onSaveInstanceState aufgerufen wird, es nicht garantiert, dass Sie das Bundle erhalten. onRestoreInstanceState wird nur aufgerufen, wenn die Aktivität zuvor vom System beendet wurde. –

+0

Können Sie mir bitte einen Tipp geben, wie kann ich Werte aus meiner Aktivität speichern (das wäre nur in meiner Anwendungsdauer persistent) –

3

Dies geschieht, weil man auf die harte Weise navigieren. Wenn Sie die standardmäßige Rücklauftastennavigation des Telefons verwenden, wird Ihr onCreate das Bundle erhalten.

Um dieses Problem zu umgehen, empfehle ich, dass Sie Ihren Status in gemeinsamen Voreinstellungen sowie eine Sicherung speichern. Wenn das Paket null ist, stellen Sie es in den freigegebenen Einstellungen wieder her.

0

Ich habe in diesem Fall ein Flag und SharedPreferences verwendet. Dies sollte funktionieren und wenn Sie die Bildschirmausrichtung ändern.

Verwandte Themen