ViewModel 如何保留数据?

How ViewModel retains data?

viewModel 如何在配置更改时保留数据,而不是当我们尝试重新实例化 activity.

ViewModel objects are scoped to the Lifecycle passed to the ViewModelProvider when getting the ViewModel. The ViewModel remains in memory until the Lifecycle it's scoped to goes away permanently

 viewModel = ViewModelProviders.of(this)[MainActivityViewModel::class.java]

这里this是生命周期所有者MainActivity。
在轮换/配置更改之前: 旋转/配置更改后:

我们可以在这里清楚地看到 activity 的实例(所有者)和生命周期在旋转后发生了变化。那么为什么它只在配置更改中保存数据。同时,当我尝试手动创建相同 activity 的新实例以重新创建此场景时,视图模型未保留数据。

视图模型是否保留数据的决定性参数是什么。
以及为什么 viewModel 只为配置更改保留数据,而不为相同 activity.

的新实例保留数据

在 ComponentActivity 构造函数中 activity/ 片段的生命周期设置了一个观察者。

getLifecycle().addObserver(new LifecycleEventObserver() {
            @Override
            public void onStateChanged(@NonNull LifecycleOwner source,
                    @NonNull Lifecycle.Event event) {
                if (event == Lifecycle.Event.ON_DESTROY) {
                    // Clear out the available context
                    mContextAwareHelper.clearAvailableContext();
                    // And clear the ViewModelStore
                    if (!isChangingConfigurations()) {
                        getViewModelStore().clear();
                    }
                }
            }
        });

ComponentActivity 是 Fragment 和 AppCompactActivity 的父级 class。
它会在每次进行生命周期回调时触发,如果它的 onDestroy() 回调,如果它不是配置更改只有这样它才会清除 viewModelStore。

           if (!isChangingConfigurations()) {
             getViewModelStore().clear();
           }

所以决定参数是isChangingConfigurations()