Как сохранять состояние View при повороте экрана в Android
Что проверяют
Понимаете ли вы, что при повороте активность пересоздаётся, и знаете ли современный набор инструментов.
Как отвечать
При смене конфигурации активность уничтожается и создаётся заново. Поэтому всё, что хранится в её полях, теряется.
Инструменты по назначению:
- ViewModel: переживает пересоздание активности, потому что живёт в отдельном хранилище, привязанном к владельцу, а не к экземпляру. Основное место для данных экрана;
- SavedStateHandle: то же самое плюс переживает смерть процесса, потому что сохраняется в
Bundle. Для того, что человек ввёл: текст поиска, выбранный фильтр; - onSaveInstanceState и
rememberSaveableв Compose: тот же механизм на уровне представления. Ограничен размером транзакции Binder, поэтому только маленькие значения; - автоматическое сохранение: у представлений с идентификатором состояние (текст, прокрутка) сохраняется системой само. Отсюда важность уникального
android:id; - база или DataStore: то, что должно пережить перезапуск приложения.
Важно разделять три уровня: пересоздание активности (ViewModel достаточно), смерть процесса в фоне (нужен SavedStateHandle или Bundle), полное закрытие приложения (нужно постоянное хранилище).
Отдельно про android:configChanges: перехват поворота, чтобы активность не пересоздавалась, выглядит как простое решение, но ломает применение ресурсов под новую конфигурацию и считается плохой практикой, кроме особых случаев вроде видеоплеера.
Где спотыкаются
Держат данные в полях активности.
Ставят configChanges вместо нормального сохранения состояния.
Кладут в Bundle крупные объекты и ловят падение по размеру транзакции.
Не различают пересоздание активности и смерть процесса.