Activity не может "пережить" изменение конфигурации (например поворот экрана). Это потому, что при изменении конфигурации приложение должно подобрать наиболее подходящее к новой конфигурации состояние, а для этого Activity должна быть пересоздана. Возникает проблема: если хранить текущее состояние UI в Activity, то при смене конфигурации текущее состояние UI будет утеряно.
ViewModel приходит на помощь, она входит в инструментарий Android Jetpack, не уничтожается при изменении конфигурации и поэтому лучшим образом подходит для хранения состояния и бизнес логики для UI.
SavedStateHandle
Использование SavedStateHandle позволяет сохранить состояние UI не только при изменении конфигурации, но и при пересоздании процесса.
Как это выглядит по шагам:
- Пользователь переключился на другое приложение.
- Андроид через какое-то время завершит процесс оставленного приложения, чтобы освободить ресурсы системы.
- Спустя время пользователь переключается на оставленное приложение, Activity будет вновь создана, а SavedStateHandle вернет состояние UI.
- Для пользователя все выглядит так, как будто процесс не был уничтожен, а все время висел в фоне.
SavedStateHandle это Map (ключ - значение), которая хранит состояние UI во время уничтожения процесса системой.
SavedStateHandle сериализуется и записывается на диск во время уничтожения процесса. Обладает ограниченными возможностями для хранения, поэтому в ней следует держать только минимально необходимую информацию.
Области действия Activity и ViewModel
Подключение ViewModel в проект.
Для использования ViewModel в проект надо подключить две зависимости (версия может отличаться):
androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2
androidx.activity:activity-ktx:1.8.1
Использование ViewModel
Данные и логика, относящаяся к UI должны храниться в созданном классе наследнике ViewModel.
В Activity получаем данные для UI из ViewModel.
Заключение
ViewModel и SavedStateHandle отлично справляются с хранением UI состояния в то время как Activity или даже процесс приложения будут уничтожены.
Их область применения - сохранить состояние UI при текущей работе приложения в ситуациях:
- изменения конфигурации (например при повороте экрана)
- уничтожения процесса системой во время бездействия, а потом его пересоздания.
ViewModel и SavedStateHandle не подходят для длительного хранения данных приложения.
#программирование #android