屏幕旋转时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
相关产品推荐
相关产品推荐

