Найти тему
Zen coder

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

Оглавление

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