Что сохранить, а что нет?
Когда-нибудь задумывались, почему текст в EditText
автоматически сохраняется при изменении ориентации? Ну, этот ответ для вас.
Когда экземпляр Действия уничтожается, и Система заново создает новый экземпляр (например, изменение конфигурации). Он пытается воссоздать его, используя набор сохраненных данных старого состояния активности ( состояние экземпляра ).
Состояние экземпляра - это набор пар ключ-значение , хранящихся в объекте Bundle
.
По умолчанию система сохраняет объекты View, например, в Bundle.
- Текст в
EditText
- Положение прокрутки в
ListView
и т. Д.
Если вам нужно сохранить другую переменную как часть состояния экземпляра, вам следует использовать метод OVERRIDE onSavedInstanceState(Bundle savedinstaneState)
.
Например, int currentScore
в GameActivity
Подробнее о onSavedInstanceState (Bundle saveinstaneState) при сохранении данных
@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);
}
Так что по ошибке, если вы забудете позвонить
super.onSaveInstanceState(savedInstanceState);
поведение по умолчанию
не будет работать, т.е. текст в EditText не будет сохранен.
Что выбрать для восстановления состояния активности?
onCreate(Bundle savedInstanceState)
OR
onRestoreInstanceState(Bundle savedInstanceState)
Оба метода получают один и тот же объект Bundle, поэтому не имеет значения, где вы пишете логику восстановления. Единственное отличие состоит в том, что в методе onCreate(Bundle savedInstanceState)
вы должны будете дать нулевую проверку, пока она не нужна в последнем случае. Другие ответы уже содержат фрагменты кода. Вы можете отослать их.
Подробнее о onRestoreInstanceState (Bundle saveinstaneState)
@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);
}
Всегда вызывайте super.onRestoreInstanceState(savedInstanceState);
, чтобы система по умолчанию восстановила иерархию просмотра
Бонус
onSaveInstanceState(Bundle savedInstanceState)
вызывается системой только тогда, когда пользователь намеревается вернуться в действие. Например, вы используете приложение X и неожиданно получаете звонок. Вы переходите в приложение вызывающего абонента и возвращаетесь в приложение X. В этом случае будет вызван метод onSaveInstanceState(Bundle savedInstanceState)
.
Но учтите это, если пользователь нажимает кнопку возврата. Предполагается, что пользователь не намерен возвращаться в действие, поэтому в этом случае система не будет вызывать onSaveInstanceState(Bundle savedInstanceState)
.
Вы должны учитывать все сценарии при сохранении данных.
Соответствующие ссылки:
Демонстрация поведения по умолчанию
Официальная документация Android .