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.