Android 为什么不是';当我旋转屏幕时,ViewModel对象不会被破坏吗?

Android 为什么不是';当我旋转屏幕时,ViewModel对象不会被破坏吗?,android,android-jetpack,Android,Android Jetpack,我读过 我创建活动并将viewModel与活动生命周期关联,viewModel的生命周期等于活动的生命周期 1:当我完成活动时,活动的onDestroy()将被激发,viewModel的onCleared()将被激发,然后viewModel将被销毁。它就是这样运行的 2:如果我旋转该活动的屏幕,该活动将首先被销毁,然后再重新创建。 因此,当我旋转屏幕时,活动的onDestroy()将被触发,活动的生命周期将结束,因此我认为viewModel的生命周期也将结束,viewModel的onCleare

我读过

我创建活动并将viewModel与活动生命周期关联,viewModel的生命周期等于活动的生命周期

1:当我完成活动时,活动的
onDestroy()
将被激发,viewModel的
onCleared()
将被激发,然后viewModel将被销毁。它就是这样运行的

2:如果我旋转该活动的屏幕,该活动将首先被销毁,然后再重新创建。
因此,当我旋转屏幕时,活动的
onDestroy()
将被触发,活动的生命周期将结束,因此我认为viewModel的生命周期也将结束,viewModel的
onCleared()
将被触发,然后viewModel将被销毁,对吗?

否,ViewModel仅在活动完成时销毁(由于用户完全拒绝该活动或由于对该活动调用finish())


来源:

ViewModelStoreOwner:ViewModelStoreOwner只是一个界面。实现此接口定义的getViewModelStore()的任何类都将成为ViewModelStore的所有者

片段和活动都实现了ViewModelStoreOwner。这些类维护viewModelStore,并适当地恢复值

ViewModelStore可以被视为在HashMap中存储ViewModels的容器。其中键是字符串值,值是要保存的ViewModel(ViewModelProvider使用字符串\ U键+ViewModel类规范名称的串联)

ViewModel如何经受住配置更改: 每个活动和片段都有一个ViewModelStore,这使它们成为ViewModelStoreOwner。 每当活动首次启动时,都会调用getViewModelStore()方法,如果该方法为null,则会创建ViewModelStore实例。 CustomViewModelFactory用于创建ViewModel,因为如果尚未为特定ViewModelStoreOwner创建新实例,Android将为您提供一个新实例 然后将ViewModel存储到ViewModelStore中

如果继续并旋转屏幕,将调用OnRetainOnConfiguration instance(),并将viewModelStore实例保存到非配置实例中,以便在配置更改后使用

当应用程序完成旋转时,将调用getViewModelStore()方法,并从非配置实例对象向活动提供ViewModelStore的旧实例。 这就是ViewModel如何经受住配置更改


观察生命周期事件,如果配置未更改(设备未旋转且应用程序正在关闭),出现onDestroy事件时,viewModel store将被清除。

谢谢!您的意思是旋转屏幕只是临时销毁活动,而不会销毁ViewModel对象吗?是的,当系统临时销毁活动时,将调用该活动的onDestroy。ViewModel将被保留。