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

屏幕旋转时ViewModel未被清除的原因是什么?

关于屏幕旋转时ViewModel不被清除的问题解答

我们知道,Activity在屏幕旋转时会调用以下方法:
onPause() -> onSaveInstanceState() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()
由此可见onDestroy()方法会被调用。既然ViewModel具备生命周期感知能力,为何它不会被清除仍能保留数据?


核心原因:ViewModel 区分两种 onDestroy() 场景

Android 系统中,Activity 的 onDestroy() 触发分为两类:

  • 配置变更导致的销毁:比如屏幕旋转、系统语言切换这类系统配置变化引发的销毁,系统会在销毁后立即重建一个新的Activity实例。
  • 真正的销毁:比如用户按下返回键、调用finish()方法,或者系统因内存不足彻底回收Activity。

ViewModel 的生命周期感知逻辑专门针对这两种场景做了区分:

  • 当Activity因**配置变更触发onDestroy()**时,ViewModel 会被框架保留,不会被清除;新重建的Activity实例可以通过ViewModelProvider获取到同一个ViewModel对象,自然就能保留之前的数据。
  • 只有当Activity发生真正的销毁时,ViewModel 才会被框架调用onCleared()方法,完成数据清除与资源释放。

底层逻辑简述

ViewModel 由 ViewModelProvider 负责管理,内部通过 ViewModelStore 存储实例。当Activity因配置变更销毁时,ViewModelStore 会被系统保留并传递给新的Activity实例;只有当Activity真正销毁时,ViewModelStore 才会被清空,对应的ViewModel才会被回收。


内容的提问来源于stack exchange,提问作者Balaji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:15:44