Ответ вслух Junior Жизненный цикл Activity и Fragment спрашивают часто обновлено

Смена конфигурации и сохранение состояния

Вопрос

Что происходит при повороте экрана и как ты сохраняешь состояние экрана?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

При повороте, смене языка или темы Activity по умолчанию пересоздаётся: старый экземпляр проходит onPause, onStop, onDestroy, создаётся новый объект, и всё, что лежало в его полях, пропадает.

Что должно прозвучать в ответе

  • 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 ошибок.