1、videModel是如何創(chuàng)建的?何時(shí)創(chuàng)建的?如何銷毀viewModel?
答:viewModel的初始化很簡單,使用ViewModelProvider就可以創(chuàng)建ViewModel實(shí)例。
第一步:了解下構(gòu)造方法;
viewModelProvider的構(gòu)造方法中,需要兩個(gè)參數(shù),一個(gè)是viewModelStoreOwner,一個(gè)是Factory.這兩個(gè)參數(shù)中viewModelStoreOwner是存放viewModel對象的。Factory類是負(fù)責(zé)創(chuàng)建viewModle實(shí)例的。
第二步;通過viewModelProvider對象的get()方法獲取viewModel實(shí)例,
其中viewModel有兩種,一種是AndroidViewModel和viewModel,AndroidViewModel傳入的參數(shù)是Application.,全局的生命周期。
viewModel如何銷毀?分為在Activity中的銷毀過程和在Fragment中的銷毀過程
? ? 1.在Activity中的銷毀。
在ComponentActivity的構(gòu)造方法中,可以看到通過Lifecycle在ON_DESTROY事件中銷毀ViewModel。
? ? ? ?2.在Fragment中的銷毀。
首先通過代碼跟蹤到ViewModelStore的clear()方法調(diào)用的地方,在FragmentManagerViewModel類的clearNonConfigState()方法中找到了ViewModel的銷毀邏輯。

2、viewModel的生命周期如何和組件的生命周期綁定?
答:主要還是通過Lifecyle與組件的生命周期方法來進(jìn)行回調(diào)管理的。
3、為什么Activity重建時(shí),viewModel保存的數(shù)據(jù)沒有丟失?
在Activity重建時(shí)會(huì)執(zhí)行destory生命周期事件,那么為什么ViewModel沒有銷毀呢?
通過對ComponentActivity的getViewModelStore()方法進(jìn)行分析??梢哉业竭@個(gè)問題的答案。

可以看大mViewModelStore變量如果是null的話,會(huì)從NonConfigurationInstances實(shí)例中取實(shí)例。
4、Fragment之間如何共享viewModel?
答:在分析ViewModel的銷毀過程時(shí),我們看到Activity與Fragment存儲(chǔ)VieModel是分離的,那么同一個(gè)Activity下的Fragment是如何共享ViewModel的呢?
它們其實(shí)共享的是Activity的ViewModel。

這個(gè)實(shí)現(xiàn)的邏輯就在activityViewModels()中。

在activityViewModels()的實(shí)現(xiàn)中可以看到是requireActivity()獲取的viewModelStore。以此來實(shí)現(xiàn)共享ViewModel。