ViewModel переживает изменения конфигурации (например, поворот экрана) благодаря механизму ViewModelStore, который сохраняется системой через onRetainNonConfigurationInstance() (в старых версиях) или ViewModelProvider (в современных реализациях).
Жизненный цикл ViewModel:
ViewModelProvider.of()
)Схема сохранения:
Activity уничтожается → ViewModel сохраняется →
Новая Activity создается → Получает тот же ViewModel
Вот как можно реализовать аналогичный функционал:
class RetainableManager : ViewModel() {
private val data = MutableLiveData<String>()
fun setData(value: String) {
data.value = value
}
fun getData(): LiveData<String> = data
}
class StateHolder : RetainableCustomObject() {
var importantData: String? = null
}
class RetainableCustomObject {
companion object {
private var instance: RetainableCustomObject? = null
fun getInstance(): RetainableCustomObject {
return instance ?: RetainableCustomObject().also { instance = it }
}
}
}
class MyActivity : AppCompatActivity() {
private lateinit var stateHolder: StateHolder
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Получаем существующий или создаем новый
stateHolder = StateHolder.getInstance()
if (savedInstanceState == null) {
// Первая инициализация
stateHolder.importantData = "Initial Data"
} else {
// Восстановление после поворота
textView.text = stateHolder.importantData
}
}
}
override fun onRetainCustomNonConfigurationInstance(): Any? {
return customData // Сохраняем данные
}
// В onCreate():
val data = lastCustomNonConfigurationInstance as? CustomData
class MyViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
val data: LiveData<String> = savedStateHandle.getLiveData("key")
fun saveData(value: String) {
savedStateHandle.set("key", value)
}
}
Интеграция с Lifecycle:
Поддержка корутин:
viewModelScope
автоматически отменяется при очисткеСовместимость с Jetpack:
Не сохраняется при убийстве процесса:
SavedStateHandle
Один ViewModel на scope:
ViewModel сохраняет свое состояние при повороте экрана благодаря системе хранения экземпляров в ViewModelStore. Реализовать подобный механизм можно через синглтон-подход или сохранение объектов в onRetainNonConfigurationInstance, но готовое решение ViewModel предпочтительнее благодаря глубокой интеграции с Android Jetpack и автоматическому управлению жизненным циклом.