Sobes.tech
Назад к вопросам
Junior — Middle
53

Каким образом Android реализует механизм сохранения состояния ViewModel при изменениях конфигурации или в процессе жизненного цикла?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

ViewModel сама по себе не “сохраняет” состояние в постоянное хранилище, а переживает изменения конфигурации за счет своей привязки к ViewModelStoreOwner — обычно это Activity или Fragment. При пересоздании экрана из‑за поворота или других конфигурационных изменений Android возвращает ту же ViewModel, пока жив ViewModelStore. Для восстановления после убийства процесса дополнительно используют SavedStateHandle или другие механизмы сохранения данных.

Определение:

ViewModel — это объект, который хранит данные для UI и живет дольше, чем конкретный экземпляр Activity или Fragment.
При изменении конфигурации старая Activity уничтожается и создается новая, но ViewModelStore сохраняется, поэтому новая Activity получает ту же ViewModel.
Если же процесс приложения был убит системой, сама ViewModel не восстанавливается автоматически, и для этого нужен отдельный механизм, чаще всего SavedStateHandle, который позволяет сохранить небольшое состояние в SavedInstanceState.

Пример использования:

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

class UsersViewModel(
    private val savedStateHandle: SavedStateHandle
) : ViewModel() {

    val filter: StateFlow<String> =
        savedStateHandle.getStateFlow("filter", "all")

    fun setFilter(value: String) {
        savedStateHandle["filter"] = value
    }
}

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

Пояснение кода:

  1. ViewModel создается не напрямую в UI, а через ViewModelProvider или через инструменты вроде by viewModels().
  2. Android связывает эту ViewModel с ViewModelStoreOwner.
  3. При повороте экрана старая Activity уничтожается, но ViewModelStore не выбрасывается сразу.
  4. Новая Activity запрашивает ViewModel с тем же ключом и получает уже существующий экземпляр.
  5. SavedStateHandle — это отдельный механизм для небольших данных, которые можно восстановить после пересоздания процесса.
  6. Поэтому корректно говорить так: ViewModel переживает конфигурационные изменения, а для восстановления после смерти процесса используется SavedStateHandle, а не сама ViewModel.

Ключевые моменты:

  • ViewModel сохраняется не “магически”, а благодаря ViewModelStore.
  • При изменении конфигурации Android пересоздает UI, но может вернуть ту же ViewModel.
  • ViewModel не гарантирует восстановление после убийства процесса.
  • Для восстановления небольшого состояния используют SavedStateHandle.
  • ViewModel подходит для UI-состояния и данных, связанных с экраном, но не для надежного долговременного хранения.
  • На собеседовании важно разделять: переживание конфигурации и восстановление после смерти процесса — это разные механизмы.