Android-Dokumentation, die über das Speichern von Zuständen und einen sehr guten Artikel zum Speichern von Zuständen in Aktivität und Fragment erklärt.
Speichern und Wiederherstellen von Aktivitätszustand Es gibt einige Szenarien, in denen Ihre Aktivität aufgrund der normalen App Verhalten zerstört wird, wie zum Beispiel, wenn der Benutzer Drücken Sie die Zurück-Taste oder Ihre Aktivität signalisiert ihre eigene Zerstörung durch den Aufruf der finish() -Methode. Das System kann auch den Prozess mit Ihrer Aktivität zur Wiederherstellung von Speicher zerstören, wenn sich die Aktivität im Status Gestoppt befindet und lange Zeit nicht verwendet wurde oder wenn die Vordergrundaktivität mehr Ressourcen erfordert.
Wenn Ihre Aktivität zerstört wird, weil der Benutzer auf Zurück drückt oder die Aktivität sich selbst beendet, ist das Systemkonzept dieser Aktivitätsinstanz für immer verloren, da das Verhalten anzeigt, dass die Aktivität nicht mehr benötigt wird. Wenn jedoch das System die Aktivität aufgrund von Systemeinschränkungen (und nicht als normale App-Verhalten) zerstört, dann obwohl die tatsächliche Aktivität Instanz gegangen ist, erinnert das System, dass es existierte, so dass, wenn der Benutzer es navigiert zurück, legt das System einen neuen Instanz der Aktivität, die eine Gruppe gespeicherter Daten verwendet, die den Status der Aktivität bei deren Zerstörung beschreibt. Die gespeicherten Daten, die das System zum Wiederherstellen des vorherigen Status verwendet, werden als Instanzstatus bezeichnet und sind eine Sammlung von Schlüssel/Wert-Paaren, die in einem Bundle-Objekt gespeichert sind.
Standardmäßig verwendet das System der Bundle Beispiel Statusinformationen zu dem einzelnen View-Objekt in Ihrer Tätigkeit Layout (wie der Textwert eingegeben in ein EditText widget) zu speichern. So , wenn Ihre Aktivitätsinstanz zerstört und neu erstellt, wird der Zustand des Layouts in seinen vorherigen Zustand ohne Code gestellt, indem Sie benötigt. Ihre Aktivität verfügt jedoch möglicherweise über weitere Statusinformationen, die Sie wiederherstellen möchten, z. B. Elementvariablen, die den Fortschritt des Benutzers in der Aktivität protokollieren.
Speichern Sie Ihren Aktivitätszustand Wie Ihre Aktivität zu stoppen beginnt, ruft das System die onSaveInstanceState() -Methode, um Ihre Aktivität Zustandsinformation mit einer Sammlung von Schlüssel-Wert-Paaren zu speichern. Die Standardimplementierung dieser Methode spart transiente Informationen über den Zustand der Ansichtshierarchie Aktivität, wie der Text in einem EditText Widget oder die Bildlaufposition eines Listview-Widgets. Ihre Anwendung sollte die onSaveInstanceState() Callback nach dem onPause() -Methode, und vor OnStop() implementieren. Implementieren Sie diesen Rückruf nicht in onPause().
Vorsicht: Sie müssen immer die Superklassenimplementierung von onSaveInstanceState() aufrufen, damit die Standardimplementierung den Status der Ansichtshierarchie speichern kann.
Um zusätzliche Statusinformationen für Ihre Aktivität zu speichern, müssen Sie onSaveInstanceState() überschreiben und Schlüssel/Wert-Paare zum Bundle-Objekt hinzufügen, das für den Fall gespeichert wird, dass Ihre Aktivität unerwartet zerstört wird. Zum Beispiel:
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
Hinweis: Damit das Android-System den Zustand der Ansichten in Ihrer Aktivität wiederherzustellen, muss jede Ansicht eine eindeutige ID, die von dem Android geliefert: id-Attribut.
Um persistente Daten wie Benutzereinstellungen oder Daten für eine Datenbank zu speichern, sollten Sie geeignete Gelegenheiten ergreifen, wenn Ihre Aktivität im Vordergrund steht. Wenn keine solche Möglichkeit besteht, sollten Sie diese Daten während der onStop() - Methode speichern.
Wiederherstellen des Aktivitätszustand Wenn Ihre Aktivität neu erstellt wird, nachdem es zuvor zerstört wurde, können Sie Ihren gespeicherten Zustand aus dem Bundle, dass das System auf Ihre Aktivität passiert erholen können. Die Callback-Methoden onCreate() und onRestoreInstanceState() empfangen dasselbe Bundle, das die Instanzstatusinformationen enthält.
Da die onCreate() -Methode aufgerufen wird, ob das System eine neue Instanz Ihrer Aktivität erstellt oder eine vorherige erneut erstellt, müssen Sie überprüfen, ob der Status Bundle null ist, bevor Sie versuchen, sie zu lesen. Wenn es null ist, erstellt das System eine neue Instanz der Aktivität, anstatt eine vorherige Instanz wiederherzustellen, die zerstört wurde.
Zum Beispiel kann der folgende Code-Schnipsel zeigt, wie Sie einige Zustandsdaten in onCreate wiederherstellen():
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Always call the superclass first
// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
// Restore value of members from saved state
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
} else {
// Probably initialize members with default values for a new instance
}
...
}
Statt den Zustand während onCreate der Wiederherstellung() Sie onRestoreInstanceState implementieren können(), die das System nach der Methode onStart() aufruft. Das System ruft onRestoreInstanceState() nur dann, wenn es einen gesicherten Zustand ist wieder herzustellen, so brauchen Sie nicht zu überprüfen, ob das Bundle ist null:
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}
Achtung: Immer die übergeordnete Klasse Implementierung von onRestoreInstanceState nennen (), so dass die Standardimplementierung den Status der Ansichtshierarchie wiederherstellen kann.
Aus Ihrer Antwort, ich habe meine Frage bearbeitet. Danken. – Orwel
Überprüfen Sie meine zweite Antwort mit mehr Details und Code, um zu erklären, welche Daten kostenlos gespeichert werden und welche Daten Sie codieren müssen! Wenn es erklärt, dann akzeptiere die Antwort und stimme ab! – JRG
Mein schlechter, Sie antworten auf meine Frage. Danke JRG. – Orwel