(译) 针对 ViewModel 的 Saved State 模块

原文链接

正如在之前保存 UI 状态文章所提及到的,ViewModel 对象可以处理配置更改,所以你没必要
担心转向和其它情形下的状态处理。但是,你需要处理系统触发的进程死亡,你可能想要使用 onSaveInstanceState() 作为备选。

UI 状态通过存储或者被引用在 ViewModel 对象中,而不是 activity 里面;所以使用
onSaveInstanceState() 需要一些样板代码,而这些代码这个模块能够为你处理。

当模块设置好了,ViewModel 对象通过它的构造函数接收到了一个 SavedStateHandle 对象。
这是一个键值对 map , 它让你能够从 saved state 写入和获取对象。这些只会在进程被系统杀死后持久化然后通过相同的对象保留下来。

注意:状态必须是简单和轻量的。对于复杂或庞大的数据你应该使用本地存储。

设置和使用

为了导入 saved State 模块 到你的 Android 项目中,看下 Lifecycle 发布日志的依赖声明指导。

为了设置 ViewModel 去接收一个 SavedStateHandle,你需要使用一个扩展了 AbstartSavedStateVMFactory 的工厂去创建它们。

1
2
val vm = ViewModelProvider(this, SavedStateVMFactory(this))
.get(SavedStateViewModel::class.java)

此后,你的 ViewModel 可以有 接收 SavedStateHandle 的构造函数:

1
class SavedStateViewModel(private val state: SavedStateHandle) : ViewModel() { ... }

存储和获取值

SavedStateHandle 类有着你期待用于键值map的方法:

  • get(String key)
  • contains(String key)
  • remove(String key)
  • set(String key, T value)
  • keys()

也有一个特殊的方法:getLiveData(String key),返回 包裹在 LiveData 观察对象中的值。

可被接受的类

类型/类 数组支持
double double[]
int int[]
long long[]
String String[]
byte byte[]
char char[]
CharSequence CharSequence[]
float float[]
parcelable Parcelable[]
Serializable Seriablizable[]
short short[]
SparseArray
Binder
Bundle
ArrayList
Size (only in API 21+)
SizeF (only in API 21+)
非典型前端coder wechat
想要随时Follow我的最新博客,可扫码关注我的公众号