12 – ViewModel的已保存状态模块

  • Post author:
  • Post category:其他




ViewModel的已保存状态模块



ViewModel


对象可以处理配置更改,因此您无需担心旋转时或其他情况下的状态。但是,如果您需要处理系统发起的进程终止,则可以使用


onSaveInstanceState()


作为备用方式。

界面状态通常在


ViewModel


对象中(而不是 Activity 中)存储或引用;因此,使用


onSaveInstanceState()


时需要该模块可以为您处理的某个样板。

模块设置好以后,


ViewModel


对象会通过其构造函数接收


SavedStateHandle


对象。这是一个键值对映射,用于向已保存状态写入对象以及从其中检索对象。这些值会在进程被系统终止后继续保留,并通过同一对象保持可用状态。


注意

:状态必须是简单的轻量级状态。对于复杂或大型数据,您应该使用

本地持久性存储



设置和使用

声明

        // Saved state module for ViewModel
        implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version"

设置


ViewModel


来接收 SavedStateHandle,您需要使用可扩展


AbstractSavedStateVMFactory


的 Factory 来创建它们。

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

之后,ViewModel 便可以有一个接收 SavedStateHandle 的构造函数:

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



存储和检索值



SavedStateHandle


类包含键值对映射应有的方法:


  • 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 Serializable[]
short short[]
SparseArray
Binder
Bundle
ArrayList
Size (only in API 21+)
SizeF (only in API 21+)



其他资源



Codelab


Android 生命周期感知型组件 Codelab



版权声明:本文为liubo253原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。