jetpack-------ViewModelSavedState(即使进程在后台被系统杀死数据也能存活)

ViewModel在activity重新创建(进入后台,屏幕翻转,语言切换)数据都不会丢失,但是当后台把ViewModel杀死进程之后,ViewModel也会被杀死,UI数据全没了,咋办?

用ViewModelSavedState。

MyViewModel

package com.example.viewmodelsavedstate;

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class MyViewModel extends ViewModel {
    private MutableLiveData<Integer> number;

    public MutableLiveData<Integer> getNumber() {
        if (number == null){
            number = new MutableLiveData<>();
            number.setValue(0);
        }
        return number;
    }

    public void add(){
        number.setValue(number.getValue()+1);
    }
}

之前我们的解决方法是使用Bundle:

package com.example.viewmodelsavedstate;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProvider;

import android.os.Bundle;

import com.example.viewmodelsavedstate.databinding.ActivityMainBinding;


public class MainActivity extends AppCompatActivity {

    MyViewModel myViewModel;
    ActivityMainBinding mainBinding;
    final static String KEY_NUMBER = "my_number";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);

        myViewModel = new ViewModelProvider(this,new ViewModelProvider.NewInstanceFactory()).get(MyViewModel.class);

        mainBinding.setData66(myViewModel);
        mainBinding.setLifecycleOwner(this);

        //**********进入后台之后还能获取到之前保存在Bundle的值***************************
        if (savedInstanceState != null){
            String string = savedInstanceState.getString(KEY_NUMBER);
            myViewModel.getNumber().setValue(Integer.valueOf(string));
        }

    }

    //通过Bundle这个对象保存数据,即使杀了后台也没关系
    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString(KEY_NUMBER, String.valueOf(myViewModel.getNumber()));
    }
}

但是我们现在感觉b格不够,现在用ViewModel Savedstate   算了懒得学了,用上面那个得了

首先还是导入依赖以及android{}里面写

dataBinding{
enabled true
}
implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0-alpha01'

 

posted @ 2021-09-28 17:04  涂妖教  阅读(182)  评论(0)    收藏  举报