Activity重建时,ViewModel没有被销毁
屏幕旋转时,Activity会执行onDestroy()函数,然后重新onCreate()
如果数据存在Activity中,那么在此时会丢失,但是ViewModel的生命周期更长,只有在Activity因为finish而调用onDestroy()的时候,才会调用onCleared(),所以内部数据依旧存活
ViewModelStore容器
ViewModelStore是一个map容器,专门用于存放ViewModel的实例,
流程如下:
- 屏幕旋转前:Activity + ViewModelStore(里面存着ViewModel)
- 屏幕旋转时:旧 Activity 销毁,但系统把 ViewModelStore 交给新 Activity
- 屏幕旋转后:新 Activity 通过 ViewModelProvider 获取 ViewModel,先去 ViewModelStore 里找,找到了就直接返回(同一个实例)
如何保管ViewModelStore?
在Activity销毁前,会通过onRetainNonConfigurationInstance()来保存ViewModelStore,重建后再取回来,这个机制是 进程级别的临时缓存,只存在于本次 App 进程未被系统杀死的前提下。使得数据有机会被重新取回。