Was sparen und was nicht?
Haben Sie sich jemals gefragt, warum der Text im EditText
automatisch gespeichert wird, wenn sich die Ausrichtung ändert? Nun, diese Antwort ist für Sie.
Wenn eine Instanz einer Aktivität zerstört wird und das System eine neue Instanz neu erstellt (z. B. Konfigurationsänderung). Es wird versucht, es mithilfe einer Reihe gespeicherter Daten des alten Aktivitätsstatus ( Instanzstatus ) neu zu erstellen .
Der Instanzstatus ist eine Sammlung von Schlüssel-Wert- Paaren, die in einem Bundle
Objekt gespeichert sind .
Standardmäßig speichert das System beispielsweise die Ansichtsobjekte im Bundle.
- Text in
EditText
- Bildlaufposition in a
ListView
usw.
Wenn Sie eine andere Variable als Teil des Instanzstatus speichern möchten, sollten Sie dieonSavedInstanceState(Bundle savedinstaneState)
Methode OVERRIDE verwenden.
Zum Beispiel int currentScore
in einer GameActivity
Weitere Details zum onSavedInstanceState (Bundle savedinstaneState) beim Speichern von Daten
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
Wenn Sie also vergessen, super.onSaveInstanceState(savedInstanceState);
das Standardverhalten aufzurufen,
funktioniert dies versehentlich nicht, dh Text in EditText wird nicht gespeichert.
Welche Option zum Wiederherstellen des Aktivitätsstatus?
onCreate(Bundle savedInstanceState)
ODER
onRestoreInstanceState(Bundle savedInstanceState)
Beide Methoden erhalten dasselbe Bundle-Objekt, sodass es nicht wirklich wichtig ist, wo Sie Ihre Wiederherstellungslogik schreiben. Der einzige Unterschied besteht darin, dass Sie bei der onCreate(Bundle savedInstanceState)
Methode eine Nullprüfung durchführen müssen, während diese im letzteren Fall nicht benötigt wird. Andere Antworten haben bereits Code-Schnipsel. Sie können sie verweisen.
Weitere Details zum onRestoreInstanceState (Bundle savedinstaneState)
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from the saved instance
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
}
Rufen Sie immer an, super.onRestoreInstanceState(savedInstanceState);
damit das System die Ansichtshierarchie standardmäßig wiederherstellt
Bonus
Das onSaveInstanceState(Bundle savedInstanceState)
wird vom System nur aufgerufen, wenn der Benutzer beabsichtigt, zur Aktivität zurückzukehren. Zum Beispiel verwenden Sie App X und plötzlich erhalten Sie einen Anruf. Sie wechseln zur Anrufer-App und kehren zur App X zurück. In diesem Fall wird die onSaveInstanceState(Bundle savedInstanceState)
Methode aufgerufen.
Beachten Sie dies jedoch, wenn ein Benutzer die Zurück-Taste drückt. Es wird davon ausgegangen, dass der Benutzer nicht beabsichtigt, zur Aktivität zurückzukehren, und wird daher in diesem Fall onSaveInstanceState(Bundle savedInstanceState)
vom System nicht aufgerufen. Beachten Sie, dass Sie beim Speichern von Daten alle Szenarien berücksichtigen sollten.
Relevante Links:
Demo zum Standardverhalten
Offizielle Android-Dokumentation .