view model状态保存:view model保存UI数据,当Activity进入后台、屏幕翻转或者语言切换的时候,view model都是存活的,数据也不会丢失。
但是一旦发生系统杀死,view model也会随之被杀掉,此时会重新创建一个新的view model对象,原本的UI数据也会丢失,导致Activity中的界面数据随之被重置。
很多时候,我们不希望发生上述的事情,所以需要进行修正。以下是通过简单的一个例子来完成:
先将模拟器设置成开发者模式:settings -> system -> About emulated device -> Build number点击7下,则此时处于开发者模式。回退一步,找到Developer options,点击,下拉找到Apps下的Don't keep activities,点击,此时,当使用者退出该程序或者将屏幕翻转时,数据将会被销毁。
首先实现一个功能为按下按钮实现加一功能的计数器。
由于刚刚的设置,现在将屏幕翻转 ,数据会被销毁.
可以用两种方法来决解以上的问题:
1、在Activity里面调用onSaveInstanceState(),这是种比较老的方法
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(KEY_NUMBER,myViewModel.getNumber().getValue());
}
2、view model本身自带一种属性,引入一个ViewModel SavedState使得view model的存活周期跨越了其被系统杀死的过程。
将以下这句话复制到build.gradle里面:
implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-alpha01'
在MyViewModel里面添加一个handle:
public class MyViewModel extends ViewModel {
//private MutableLiveData<Integer>number;
private SavedStateHandle handle;
public MyViewModel(SavedStateHandle handle){
this.handle = handle;
}
public MutableLiveData<Integer>getNumber(){
if(!handle.contains(MainActivity.KEY_NUMBER)){
handle.set(MainActivity.KEY_NUMBER,0);
}
return handle.getLiveData(MainActivity.KEY_NUMBER);
}
public void add(){
getNumber().setValue(getNumber().getValue() + 1);
}
}
以上两种方法都可以运行成功。