Skip to content

viewmodel-savedstate-demo ​

1. 实验目标 ​

用最小 Android 实现验证状态分层的核心(对应 docs/02-memory-lifecycle/05):

  • ViewModel:跨配置变更(旋转屏幕)存活;进程被杀后销毁
  • SavedStateHandle:进程被杀重建后,轻量 key-value 能兜底恢复
  • 结论:内存态(ViewModel)抗旋转、不抗进程死亡;恢复态(SavedStateHandle)抗进程死亡

2. 工程要点 ​

  • CounterViewModel(savedState: SavedStateHandle):构造注入 SavedStateHandle(需自定义 Factory,默认工厂不支持)
  • count 为内存态:旋转保留、进程重建归零
  • savedKey 为恢复态:每次 increment() 把 step_N 写入 savedState,进程重建后回填
  • 观察手段:旋转屏幕 / 开发者选项"Don't keep activities"

3. 运行方式 ​

bash
cd labs/android/host
./gradlew installDebug

设备/模拟器打开 Android Host → 打开 ViewModel / SavedStateHandle 实验室。

验证步骤:

  1. 点"计数 +1"三次(count=3, savedKey=step_3)
  2. 旋转屏幕 → count 仍为 3(ViewModel 存活),savedKey 仍为 step_3
  3. 开发者选项开启 Don't keep activities → 按 Home 切后台再回来 → count 归零(进程被回收,ViewModel 销毁),savedKey 恢复 step_3(SavedStateHandle 兜底)

4. 预期现象 ​

操作count (ViewModel)savedKey (SavedStateHandle)
旋转屏幕保留保留
进程被杀后重建归零恢复

5. 常见误区 ​

误区实际情况
ViewModel 能跨进程恢复不能——进程死亡后 ViewModel 一并销毁,只有 SavedStateHandle / 持久层能恢复
SavedStateHandle 当存储用只放轻量恢复锚点(id/key/页码),不放业务大对象
默认工厂能注入 SavedStateHandle带构造参数必须自定义 Factory 或 viewModelFactory { initializer { ... } }

6. 对应知识库文档 ​

7. 关键源码 ​

站点构建时间:2026/8/24 23:43:17