ViewModel 源碼分析
入口
四種方式創(chuàng)建ViewModel,最終生成ViewModelStore進(jìn)行存儲(chǔ)
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
分為兩個(gè)分支,第一次和非第一次流程
第一次
ComponentActivity#getViewModelStore
---> (為空)Activity#getLastNonConfigurationInstance
---> Activity#NonConfigurationInstances(第一次為null)
---> new ViewModelStore()
非第一次
直接返回ViewModelStore
獲取實(shí)例內(nèi)容
get(NameViewModel.class)
分為兩個(gè)分支,第一次和非第一次流程
第一次
get(NameViewModel.class)
---> 第一次ViewModel為空
---> ViewModelProvider#create
---> SavedStateViewModelFactory#create
---> create
---> 反射構(gòu)造方法,ViewModelProvider->newInstance
---> 反射實(shí)例NameViewModel
ViewModelProvider#create 多個(gè)實(shí)現(xiàn)
SavedStateViewModelFactory#create
AbstractSavedStateViewModelFactory#create
NavControllerViewModel#create
ViewModelProvider#AndroidViewModelFactory#create
ViewModelProvider#NewInstanceFactory#create
NavControllerViewModel#create
LoaderManagerImpl#LoaderViewModel#create
FragmentManagerViewModel#create
非第一次
直接返回ViewModel<實(shí)例>
旋轉(zhuǎn)屏幕配置等邏輯--onRetainCustomNonConfigurationInstance存儲(chǔ)
(旋轉(zhuǎn)屏幕)LocalActivityManager#dispatchRetainNonConfigurationInstance
---> ComponentActivity#onRetainNonConfigurationInstance
---> Activity
---> NonConfigurationInstances#activity(持有ViewModelStore)
ComponentActivity#NonConfigurationInstances,存custom和viewstore
清理ViewModelStore邏輯
CommponentActivity()構(gòu)造方法
---> getLifeCycle.addObserver 添加觀察者
---> onDestroy 邏輯
---> 未改變轉(zhuǎn)屏配置!isChangingConfigurations 情況下----> 清理ViewStore
---->isChangingConfigurations轉(zhuǎn)屏--->不清理生么也不操作
追蹤到AMS
前面已經(jīng)追蹤到調(diào)用方:
LocalActivityManager#dispatchRetainNonConfigurationInstance
繼續(xù)向上追蹤代碼,會(huì)看到Binder
(Binder)LocakActivityRecord
onRetainNonConfigurationInstance

ViewModel.png
實(shí)際上,如果Activity不銷毀的話,AMS存在ViewModel的副本作為緩存。