ViewModel 源码分析
入口
四种方式创建ViewModel,最终生成ViewModelStore进行存储
nameViewModel = new ViewModelProvider.NewInstanceFactory().create(NameViewModel.class);
nameViewModel = ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()).create(NameViewModel.class);
nameViewModel = new ViewModelProvider(this).get(NameViewModel.class);
nameViewModel = ViewModelProviders.of(this).get(NameViewModel.class);
ViewModelProvider
分为两个分支,第一次和非第一次流程
第一次
ComponentActivity#getViewModelStore
---> (为空)Activity#getLastNonConfigurationInstance
---> Activity#NonConfigurationInstances(第一次为null)
---> new ViewModelStore()
非第一次
直接返回ViewModelStore
获取实例内容
get(NameViewModel.class)
分为两个分支,第一次和非第一次流程
第一次
get(NameViewModel.class)
---> 第一次ViewModel为空
---> ViewModelProvider#create
---> SavedStateViewModelFactory#create
---> create
---> 反射构造方法,ViewModelProvider->newInstance
---> 反射实例NameViewModel
ViewModelProvider#create 多个实现
SavedStateViewModelFactory#create
AbstractSavedStateViewModelFactory#create
NavControllerViewModel#create
ViewModelProvider#AndroidViewModelFactory#create
ViewModelProvider#NewInstanceFactory#create
NavControllerViewModel#create
LoaderManagerImpl#LoaderViewModel#create
FragmentManagerViewModel#create
非第一次
直接返回ViewModel<实例>
旋转屏幕配置等逻辑--onRetainCustomNonConfigurationInstance存储
(旋转屏幕)LocalActivityManager#dispatchRetainNonConfigurationInstance
---> ComponentActivity#onRetainNonConfigurationInstance
---> Activity
---> NonConfigurationInstances#activity(持有ViewModelStore)
ComponentActivity#NonConfigurationInstances,存custom和viewstore
清理ViewModelStore逻辑
CommponentActivity()构造方法
---> getLifeCycle.addObserver 添加观察者
---> onDestroy 逻辑
---> 未改变转屏配置!isChangingConfigurations 情况下----> 清理ViewStore
---->isChangingConfigurations转屏--->不清理生么也不操作
追踪到AMS
前面已经追踪到调用方:
LocalActivityManager#dispatchRetainNonConfigurationInstance
继续向上追踪代码,会看到Binder
(Binder)LocakActivityRecord
onRetainNonConfigurationInstance
实际上,如果Activity不销毁的话,AMS存在ViewModel的副本作为缓存。