最近要换工作了,所以公司没什么事,出点时间研究研究自己感兴趣的东西,今天看了下ViewModel和Activity的关系,以及Activity在横竖屏切换,分辨率改变,权限改变的情况下重走生命周期是怎么实现数据依然存在的
1. 首先,使用
我们一般在Activity中通过ViewModelProvider(ViewModelStoreOwner/ViewModelStore).get(XXViewModel.class)来获取相应的ViewModel,因为ComponentActivity和Fragment实现了ViewModelStoreOwner并重写了getViewModelStore方法,实际上我们是通过Activity或者Fragment获取到相应的ViewModel的实例的
2. 其次,为什么Activity销毁重建了,ViewModel的数据还存在?
ViewModel是存储在ViewModelStore中的,以HashMap的形式存储,
Activity销毁重建会调用ActivityThread的handleRelaunchActivity方法,该方法会回调handleDestroyActivity和handleLaunchActivity方法
handleDestroyActivity方法销毁Activity,销毁之前会把一些数据包装成NoConfigurationInstances对象,其中就包括ViewModelStore,存储到ActivityClientRecord的lastNonConfigurationInstances参数中,
handleLaunchActivity方法在创建Actvity时用同一个ActivityClientRecord实例,并将lastNonConfigurationInstances传入Activity的attach方法中,从而使重建的Activity能够获取原来Activity的参数
3. 流程图
