为什么在我旋转屏幕时 ViewModel 对象没有被销毁?

Why isn't a ViewModel object destroyed when I rotate a screen?

我已阅读The lifecycle of a ViewModel

我创建了一个 activity 并将 viewModel 关联到 activity 生命周期,viewModel 的生命周期等于 activity 的生命周期。

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

2:如果我旋转activity的屏幕,activity会先被销毁,然后再重新创建。 所以当我旋转屏幕时 activity 的 onDestroy() 将被触发,并且 activity 的生命周期将结束,所以我认为 viewModel 的生命周期也会结束,并且onCleared() 的 viewModel 将被触发,然后 viewModel 将被销毁,对吗?

不,ViewModel 仅在 activity 完成时销毁(由于用户完全关闭 activity 或由于在 activity 上调用了 finish())。

来源:https://developer.android.com/guide/components/activities/activity-lifecycle#ondestroy

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

Fragment 和 Activity 都实现了 ViewModelStoreOwner。这些 classes 维护一个 viewModelStore 并适当地恢复值。

ViewModelStore 可以看作是将 ViewModel 存储在 HashMap 中的容器。其中键是字符串值,值是要保存的 ViewModel(ViewModelProvider 使用 string_key + ViewModel class 规范名称的串联)。

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

如果继续旋转屏幕,将调用 onRetainNonConfigurationInstance() 并将 viewModelStore 实例保存到 NonConfigurationInstance 以供配置更改后使用。

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

如果配置未更改(设备未旋转且应用正在关闭),则观察生命周期事件并在 onDestroy 事件的情况下清除 viewModel 存储。