ViewModel是否能够在活动保存和恢复后生存?

时间:2017-05-30 07:36:34

标签: android viewmodel view-model-pattern android-architecture-components

如果以下列方式使用,新ViewModel类的实例可以在配置更改后继续存在:

mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);

但是,除了配置更改之外,还有一个保存还原方案,当整个应用程序的进程被终止时。

保存还原方案中是否会保留ViewModel内的字段值?

编辑:根据这个问题的答案,我写了这篇文章:Android ViewModel Architecture Component is Dangerous

2 个答案:

答案 0 :(得分:14)

根据ViewModelProvider文档(检查get方法),当应用程序的进程被终止时,ViewModel不会被保留:

  

创建的ViewModel与给定范围相关联,只要范围处于活动状态,将被保留(例如,如果它是一个活动,直到它完成或进程被杀死)

另外检查Ian Lake回答类似的问题: https://medium.com/@ianhlake/you-are-correct-the-viewmodel-is-destroyed-if-your-process-is-killed-by-android-ef611fcd51e6

  

你是对的:如果您的进程被Android杀死,ViewModel将被销毁。就像之前一样,你应该使用onSaveInstanceState()存储你必须拥有的任何数据,以便以后的状态重新创建你的Activity。

我还建议您阅读 Android ViewModel Architecture Component is Dangerous

答案 1 :(得分:1)

It seems Google offers a solution for this now

ViewModel的保存状态模块

  

UI状态通常存储或引用在ViewModel对象中,而不是   活动;所以使用onSaveInstanceState()需要一些样板   该模块可以为您处理。

     

设置模块后,ViewModel对象将收到一个   SavedStateHandle对象通过其构造函数。这是一个键值映射   这样您就可以在保存的文件中写入和检索对象   州。在进程被进程杀死之后,这些值将继续存在。   系统,并通过同一对象保持可用。


设置

implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-rc02'(2019年11月7日)


用法

  

为了设置ViewModel来接收SavedStateHandle,您需要   使用扩展的工厂创建它们   AbstractSavedStateVMFactory。

SavedStateViewModel vm = new ViewModelProvider(this, new SavedStateVMFactory(this))
        .get(SavedStateViewModel.class);
  

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


public class SavedStateViewModel extends ViewModel {
    private SavedStateHandle mState;

    public SavedStateViewModel(SavedStateHandle savedStateHandle) {
        mState = savedStateHandle;
    }
    ...
}

存储和检索值

  

SavedStateHandle类具有键值映射所需的方法:

     
      
  • 获取(字符串键)
  •   
  • 包含(字符串键)
  •   
  • 删除(字符串键)
  •   
  • 设置(字符串键,T值)
  •   
  • keys()
  •