Найти в Дзене
Zen coder

Сохранение состояния во ViewModel

Activity не может "пережить" изменение конфигурации (например поворот экрана). Это потому, что при изменении конфигурации приложение должно подобрать наиболее подходящее к новой конфигурации состояние, а для этого Activity должна быть пересоздана. Возникает проблема: если хранить текущее состояние UI в Activity, то при смене конфигурации текущее состояние UI будет утеряно. ViewModel приходит на помощь, она входит в инструментарий Android Jetpack, не уничтожается при изменении конфигурации и поэтому лучшим образом подходит для хранения состояния и бизнес логики для UI. SavedStateHandle Использование SavedStateHandle позволяет сохранить состояние UI не только при изменении конфигурации, но и при пересоздании процесса. Как это выглядит по шагам: SavedStateHandle это Map (ключ - значение), которая хранит состояние UI во время уничтожения процесса системой. SavedStateHandle сериализуется и записывается на диск во время уничтожения процесса. Обладает ограниченными возможностями для хране
Оглавление

Activity не может "пережить" изменение конфигурации (например поворот экрана). Это потому, что при изменении конфигурации приложение должно подобрать наиболее подходящее к новой конфигурации состояние, а для этого Activity должна быть пересоздана. Возникает проблема: если хранить текущее состояние UI в Activity, то при смене конфигурации текущее состояние UI будет утеряно.

ViewModel приходит на помощь, она входит в инструментарий Android Jetpack, не уничтожается при изменении конфигурации и поэтому лучшим образом подходит для хранения состояния и бизнес логики для UI.

UI layer
UI layer

SavedStateHandle

Использование SavedStateHandle позволяет сохранить состояние UI не только при изменении конфигурации, но и при пересоздании процесса.

Как это выглядит по шагам:

  1. Пользователь переключился на другое приложение.
  2. Андроид через какое-то время завершит процесс оставленного приложения, чтобы освободить ресурсы системы.
  3. Спустя время пользователь переключается на оставленное приложение, Activity будет вновь создана, а SavedStateHandle вернет состояние UI.
  4. Для пользователя все выглядит так, как будто процесс не был уничтожен, а все время висел в фоне.

SavedStateHandle это Map (ключ - значение), которая хранит состояние UI во время уничтожения процесса системой.

SavedStateHandle сериализуется и записывается на диск во время уничтожения процесса. Обладает ограниченными возможностями для хранения, поэтому в ней следует держать только минимально необходимую информацию.

Области действия Activity и ViewModel

-3

Подключение ViewModel в проект.

Для использования ViewModel в проект надо подключить две зависимости (версия может отличаться):

androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2
androidx.activity:activity-ktx:1.8.1

-4

Использование ViewModel

Данные и логика, относящаяся к UI должны храниться в созданном классе наследнике ViewModel.

ViewModel
ViewModel

В Activity получаем данные для UI из ViewModel.

Activity
Activity

Заключение

ViewModel и SavedStateHandle отлично справляются с хранением UI состояния в то время как Activity или даже процесс приложения будут уничтожены.

Их область применения - сохранить состояние UI при текущей работе приложения в ситуациях:

  1. изменения конфигурации (например при повороте экрана)
  2. уничтожения процесса системой во время бездействия, а потом его пересоздания.

ViewModel и SavedStateHandle не подходят для длительного хранения данных приложения.

#программирование #android