外观
如何理解ViewModel 能跨旋转 跨页面 跨进程死亡吗?
标准回答
配置变化时,正确通过 ViewModelProvider 等机制获取的 ViewModel 通常可以保留;跨页面是否共享取决于 ViewModelStoreOwner 的作用域;进程死亡后原 ViewModel 对象一定不在了,需要重建并恢复数据。
| 机制 | 配置变化后 | 系统回收进程后 | 适合保存 |
|---|---|---|---|
| 普通页面字段 | 通常丢失 | 丢失 | 临时显示对象 |
| ViewModel | 同作用域下可保留 | 原对象丢失 | 页面状态与相关逻辑 |
| SavedStateHandle | 可恢复 | 满足系统状态恢复条件时可恢复 | 小型参数 选中项 查询条件 |
| Room 文件 DataStore | 可重新读取 | 可重新读取 | 需要持久保存的数据 |
延伸追问
SavedStateHandle 能替代数据库吗?不能,它依赖系统保存状态机制及任务恢复条件;用户主动结束任务等情况不能当作必然恢复。不要存大图、完整海量列表或活动连接,只保存重建所需的小型参数。(ViewModel 保存状态)
内容来源
- Android 智能硬件 SDK 技术 Wiki · 原条目
Q29