Co zaoszczędzić, a czego nie?
Czy zastanawiałeś się kiedyś, dlaczego tekst w pliku EditText
jest zapisywany automatycznie podczas zmiany orientacji? Ta odpowiedź jest dla ciebie.
Gdy instancja działania zostanie zniszczona, a system odtworzy nową instancję (na przykład zmianę konfiguracji). Próbuje go odtworzyć przy użyciu zestawu zapisanych danych starego stanu aktywności ( stanu instancji ).
Stan instancji to zbiór par klucz-wartość przechowywany w Bundle
obiekcie.
Domyślnie system zapisuje na przykład obiekty View w pakiecie.
- Text in
EditText
- Przewiń pozycję w
ListView
itd.
Jeśli potrzebujesz innej zmiennej do zapisania jako części stanu instancji, powinieneś OVERRIDE onSavedInstanceState(Bundle savedinstaneState)
.
Na przykład int currentScore
w GameActivity
Więcej szczegółów na temat onSavedInstanceState (pakiet saveinstaneState) podczas zapisywania danych
@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);
}
Tak więc przez pomyłkę, jeśli zapomnisz wywołać
super.onSaveInstanceState(savedInstanceState);
domyślne zachowanie nie będzie działać, tzn. Tekst w EditText nie zostanie zapisany.
Które wybrać do przywrócenia stanu aktywności?
onCreate(Bundle savedInstanceState)
LUB
onRestoreInstanceState(Bundle savedInstanceState)
Obie metody otrzymują ten sam obiekt pakietu, więc tak naprawdę nie ma znaczenia, gdzie napiszesz logikę przywracania. Jedyną różnicą jest to, że w onCreate(Bundle savedInstanceState)
metodzie będziesz musiał dać kontrolę zerową, podczas gdy w drugim przypadku nie jest to konieczne. Inne odpowiedzi mają już fragmenty kodu. Możesz je polecić.
Więcej szczegółów na temat onRestoreInstanceState (pakiet zapisanyinstaneState)
@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);
}
Zawsze wywołuj super.onRestoreInstanceState(savedInstanceState);
, aby system domyślnie przywrócił hierarchię widoku
Premia
System onSaveInstanceState(Bundle savedInstanceState)
jest wywoływany tylko wtedy, gdy użytkownik zamierza wrócić do działania. Na przykład używasz aplikacji X i nagle otrzymujesz połączenie. Przejdziesz do aplikacji dzwoniącego i wrócisz do aplikacji X. W tym przypadkuonSaveInstanceState(Bundle savedInstanceState)
metoda zostanie wywołana.
Ale rozważ to, jeśli użytkownik naciśnie przycisk Wstecz. Zakłada się, że użytkownik nie zamierza powrócić do działania, dlatego w tym przypadku system onSaveInstanceState(Bundle savedInstanceState)
nie będzie go wywoływał. Należy pamiętać, że podczas zapisywania danych należy wziąć pod uwagę wszystkie scenariusze.
Ważne linki:
Demonstracja domyślnego zachowania
Oficjalna dokumentacja Androida .