前言:
本篇是在上一篇的基础上,进行的修改,没有看上一篇请先移步上一篇文章
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); } }
这样就可以实现前面所述的功能,数据不会丢失~