Android JetPack组件之ViewModel状态的保存(程序在后台被系统杀死数据也存活)
Posted 路宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android JetPack组件之ViewModel状态的保存(程序在后台被系统杀死数据也存活)相关的知识,希望对你有一定的参考价值。
前言:
本篇是在上一篇的基础上,进行的修改,没有看上一篇请先移步上一篇文章
Android JetPack组件之DataBinding的使用详解
想要在程序被系统杀死后,数据依然还在有两种方法。
第一种方法就是比较旧的一种方法,重写onSaveInstanceState方法,来存放我们想要保存的界面数据。
直接看修改后的DataBindingActivity中的代码
public class DataBindingActivity extends AppCompatActivity {
private ViewModelWithDataBinding viewModelWithDataBinding;
//当我们将layout文件转换为DataBinding的形式,android studio会帮我们创建这样一个类
//这个类的名称就是layout文件的名字 加上Binding
private ActivityDataBindingBinding binding;
public static final String KEY = "data_key";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//创建这个对象后,layout文件里面的标签,就会成为ActivityDataBindingBinding这个类的成员,可以直接访问
binding = DataBindingUtil.setContentView(this, R.layout.activity_data_binding);
viewModelWithLiveData = new ViewModelProvider(this).get(ViewModelWithLiveData.class);
if (savedInstanceState != null) {
viewModelWithDataBinding.getNumber().setValue(savedInstanceState.getInt(KEY));
}
binding.setData(viewModelWithDataBinding);
binding.setLifecycleOwner(this);
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState, @NonNull PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
outState.putInt(KEY, viewModelWithDataBinding.getNumber().getValue());
}
}
第二种方法使用ViewModel本身自带的属性来解决这个问题
1、首先引入依赖
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0"
2、之后将ViewModelWithDataBinding类中代码进行修改
public class ViewModelWithDataBinding extends ViewModel {
private SavedStateHandle handle;
//新增的一个构造函数
public ViewModelWithDataBinding(SavedStateHandle handle) {
this.handle = handle;
}
public MutableLiveData<Integer> getNumber() {
if (!handle.contains(DataBindingActivity.KEY)) {
handle.set(DataBindingActivity.KEY, 0);
}
return handle.getLiveData(DataBindingActivity.KEY);
}
public void add() {
getNumber().setValue(getNumber().getValue() + 1);
}
}
3、之后就是DataBindingActivity类中的修改
public class DataBindingActivity extends AppCompatActivity {
private ViewModelWithDataBinding viewModelWithDataBinding;
//当我们将layout文件转换为DataBinding的形式,Android studio会帮我们创建这样一个类
//这个类的名称就是layout文件的名字 加上Binding
private ActivityDataBindingBinding binding;
public static final String KEY = "data_key";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//创建这个对象后,layout文件里面的标签,就会成为ActivityDataBindingBinding这个类的成员,可以直接访问
binding = DataBindingUtil.setContentView(this, R.layout.activity_data_binding);
viewModelWithDataBinding = new ViewModelProvider(this,new SavedStateViewModelFactory(getApplication(),this)).get(ViewModelWithDataBinding.class);
binding.setData(viewModelWithDataBinding);
binding.setLifecycleOwner(this);
}
}
这样就可以实现前面所述的功能,数据不会丢失~
以上是关于Android JetPack组件之ViewModel状态的保存(程序在后台被系统杀死数据也存活)的主要内容,如果未能解决你的问题,请参考以下文章
Android JetPack组件之DataBinding的使用详解
Android Jetpack组件之WorkManager高级概念介绍与使用
Android JetPack组件之Room数据库的集成与详解