Android · 4 / 5

ViewModel и восстановление состояния

Отличаем пересоздание Activity от смерти процесса

Сначала определите срок жизни

ViewModel привязана к ViewModelStoreOwner, например Activity или записи back stack. Она переживает конфигурационное пересоздание своего владельца, но не смерть процесса. Два разных владельца не обязаны разделять экземпляр. Не храните в ней View или Activity: их срок жизни короче. ViewModel.

Данные Где хранить
Загруженный экран и текущая работа ViewModel
Запрос поиска, ID выбранного элемента SavedStateHandle / rememberSaveable
Документ, который нельзя потерять после закрытия приложения База или файл

Таблица — выбор для этого сценария, а не запрет иных реализаций. Saved state рассчитан на небольшие данные для восстановления, а не на полную копию базы или большие изображения. Сохранение состояния.

Восстановить причину, пересчитать результат

class SearchViewModel(private val saved: SavedStateHandle) : ViewModel() {
    val query = saved.getStateFlow("query", "")
    fun changeQuery(value: String) { saved["query"] = value }
}

Импорты — androidx.lifecycle.SavedStateHandle и androidx.lifecycle.ViewModel. После системного пересоздания процесса запрос восстанавливается, а результаты заново получают из репозитория. Сохранение связано с жизненным циклом и снимком состояния; запись после onStop не гарантирует попадания в уже сделанный снимок до следующего start/stop. Удалённая пользователем задача не обязана восстанавливаться. SavedStateHandle.

Проверяйте разные причины уничтожения

Поворот экрана не проверяет смерть процесса. «Не сохранять действия» также не заменяет этот сценарий. Отдельно проверяйте возвращение в сохранённую задачу после уничтожения фонового процесса, обычное завершение экрана и явное закрытие задачи. Не сохраняйте важные данные только в onDestroy: при уничтожении процесса вызова может не быть. Сохранение состояния.

Основа отбора: draft/activity.md, draft/viewmodel.md, draft/M++.md.

К вопросам →