配置变更时ViewModel的持久化及与新Activity重连原理问询
为什么配置变更导致Activity销毁时ViewModel不销毁?新Activity又如何重新连接?
嘿,这个问题问到点子上了!ViewModel的这个特性正是它解决配置变更数据丢失问题的核心,我给你拆解一下:
一、ViewModel为什么不会随配置变更的Activity销毁?
其实ViewModel的“生命周期”并不是绑定在单个Activity实例上的,而是绑定在Activity的ViewModelStore上。
- 当Activity因为屏幕旋转这类配置变更被销毁时,Android系统并不会把这个Activity对应的ViewModelStore一起销毁——它会把ViewModelStore暂时保留起来。
- ViewModel的实例是存储在ViewModelStore中的,只要ViewModelStore还活着,ViewModel就不会被回收。
- 只有当Activity因为“真正的销毁”(比如用户按返回键、系统内存不足强制回收非前台Activity)时,系统才会销毁对应的ViewModelStore,ViewModel才会跟着被清理掉。
简单说就是:ViewModel的宿主不是某一个Activity对象,而是系统为Activity维护的一个“数据容器”,这个容器在配置变更时会被保留。
二、新Activity怎么重新连接到现有ViewModel?
当新的Activity实例创建完成后,咱们通过ViewModelProvider获取ViewModel的代码,其实做了这些事情:
- 调用
ViewModelProvider(this).get(MyViewModel::class.java)时,这里的this是新的Activity实例,但它依然是同一个ViewModelStoreOwner(系统会把之前保留的ViewModelStore关联到这个新实例上)。 - ViewModelProvider会先检查当前ViewModelStoreOwner对应的ViewModelStore里有没有已经创建好的MyViewModel实例。
- 如果有(就是之前那个没被销毁的),就直接返回这个实例;如果没有才会创建新的。
这样一来,新Activity就拿到了和之前完全一样的ViewModel,里面的数据自然也都保留着,实现了“重新连接”的效果。
内容的提问来源于stack exchange,提问作者TareK Khoury
相关产品推荐
相关产品推荐

