Смена конфигурации и сохранение состояния
Вопрос
Что происходит при повороте экрана и как ты сохраняешь состояние экрана?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Activity пересоздаётся: onPause, onStop, onDestroy, новый onCreate
ViewModel переживает поворот, хранится в ViewModelStore
Небольшое состояние UI в SavedStateHandle или rememberSaveable
View с id сохраняют своё состояние сами
configChanges не лекарство, маскирует проблемы
Отдельно проверяю смерть процесса
Что могут спросить следом
- Почему ViewModel переживает поворот?
- Как проверить смерть процесса?
- Что нельзя класть в Bundle?
Разбор
При повороте, смене языка или темы Activity по умолчанию пересоздаётся: старый экземпляр проходит onPause, onStop, onDestroy, создаётся новый объект, и всё, что лежало в его полях, пропадает. Данные экрана я держу во ViewModel: она хранится в ViewModelStore, который передаётся новому экземпляру, поэтому переживает поворот. Небольшое состояние, которое должно пережить и смерть процесса, например введённый текст или выбранную вкладку, кладу в SavedStateHandle во ViewModel или в rememberSaveable в Compose. View с id сохраняют своё состояние сами. Отключать пересоздание через configChanges не люблю: это прячет ошибки, а смерть процесса всё равно их покажет. С Android 16 на планшетах приложение и не может запретить поворот, поэтому код обязан переживать пересоздание. Проверяю это поворотом и отдельно убийством процесса через adb.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Жизненный цикл Activity и Fragment»
- Порядок колбэков при переходе между Activity
- TransactionTooLargeException и Bundle
- Колбэки Activity
- Состояния Lifecycle
- Что переживает поворот и смерть процесса
- Жизненный цикл фрагмента и его view
- Гарантирован ли onDestroy
- Почему onPause должен быть быстрым