You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置变更时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:43:19