Android开发学习:ViewModel在屏幕旋转时为什么不会丢失数据

2 阅读1分钟

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 进程未被系统杀死的前提下。使得数据有机会被重新取回。