Какие методы жизненного цикла есть у ViewModel
Что проверяют
Понимаете ли вы, что у ViewModel нет набора колбэков как у активности, и от чего на самом деле зависит её жизнь. Следом спрашивают, переживёт ли ViewModel смерть процесса и что тогда делать с состоянием экрана.
Как отвечать
Честный ответ короткий: метод жизненного цикла у ViewModel один, onCleared(). Остальное это правила, по которым она создаётся и уничтожается:
- создание: при первом обращении через
ViewModelProvider, делегатыby viewModels(),by activityViewModels()илиviewModel()в Compose. Экземпляр кладётся вViewModelStoreвладельца; - владелец: не
LifecycleOwner, аViewModelStoreOwner. Это активность, фрагмент или запись навигационного стекаNavBackStackEntry; - переживает: поворот экрана, смену темы, языка и другие изменения конфигурации. Активность пересоздаётся, а
ViewModelStoreдостаётся новому экземпляру; - очищается: когда владелец уходит насовсем. Активность завершается без смены конфигурации, фрагмент удаляется окончательно, экран снимается с навигационного стека. В этот момент вызывается
onCleared(); - ресурсы:
viewModelScopeотменяется при очистке автоматически, а свои закрываемые объекты можно отдать черезaddCloseable()или передать в конструктор какAutoCloseable.
Про смерть процесса скажите отдельно: при нехватке памяти система убивает процесс вместе с ViewModel. Минимальное состояние экрана, например поисковый запрос или идентификатор выбранного элемента, хранят в SavedStateHandle, он восстанавливается из сохранённого Bundle.
Где спотыкаются
Перечисляют onCreate, onStart, onDestroy, перенося жизненный цикл активности на ViewModel. Интервьюер сразу понимает, что тема не разобрана.
Хранят в ViewModel ссылку на Activity, View или Context экрана. После поворота она держит уничтоженную активность, и получается утечка. Если нужен контекст, берут Application через AndroidViewModel или внедрение зависимостей.
Считают, что ViewModel заменяет сохранение состояния. После возврата в приложение, выгруженное системой, пользователь увидит пустой экран, если данные жили только в полях ViewModel.