Appearance
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"三次(count=3, savedKey=step_3)
- 旋转屏幕 → count 仍为 3(ViewModel 存活),savedKey 仍为 step_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 { ... } } |