ViewModel在页面重建时的存取
存
当页面配置发生改变,会调用ActivityThread的handleRelaunchActivity方法,里面会依次执行销毁页面handleDestroyActivity和重建页面handleLaunchActivity。在handleDestroyActivity中又会调用performDestroyActivity 方法。
最终我们的ViewModel容器就在performDestroyActivity 中存下来。
关键代码:
在Activity的retainNonConfigurationInstances方法中会调用onRetainNonConfigurationInstance方法。这个方法在ComponentActivity中实现
至此我们看到了viewModelStore的保存方法和过程。
总的来说就是,在手机发生屏幕选择等改变页面配置的操作时,在页面的销毁过程中会将ViewModel容器保存下来。
取
在ViewModelProvider的构造函数中就要求提供ViewModelStore。
在ComponentActivity的getViewModelStore中会调用ensureViewModelStore
说白了就是从上次保存的记录中取出来
ViewModel之所以能在屏幕发生选择时恢复数据,就是因为他的生命周期比Activity长。而他的生命周期之所以长是因为他会在Activity被销毁时,存在了ActivityClientRecord中,在重建页面时又从ActivityClientRecord中取出来