android view state,【Android】ViewModelSaveState 即使进程在后台被系统杀死数据也存活 两种方法...

【Android】ViewModelSaveState 即使进程在后台被系统杀死数据也存活 两种方法

寒光博客 • 2020 年 03 月 26 日

简单例子

Android 按下按钮标签中的数字累加,用onSaveInstanceState、ViewModel来存放数据

使得即使进程在后台被系统杀死数据也存活

bd13b81a018735025a753bc3b2624a66.png

代码

93921dd8757ce758d60a2506b425344d.png

ViewModel管理屏幕的数据 Activity和ViewModel对应

activtity发生进入后台、翻转、语言切换(翻转和语言切换都是activity的重新创建)

ViewModel都是存活的,所以数据不会丢失

但是一旦发生 系统杀死后台进程 则ViewModel也会被杀死,重新创建。

为了不希望这种事情发生,所以我们要进行修正 有一下方法 ,通过该简单例子来说明思路

activity_main.xml

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools">

name="data"

type="cn.dxoca.viewmodelresort.MyViewModel" />

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity">

android:id="@+id/textView"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@{String.valueOf(data.getNumber())}"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toTopOf="parent"

app:layout_constraintVertical_bias="0.216" />

android:id="@+id/button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Button"

android:onClick="@{()->data.add()}"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toTopOf="parent" />

旧方法 onSaveInstanceState

通过activity中的 onSaveInstanceState方法 来保存后台杀死后的 界面存放的数据

(系统已设置进制后台程序运行)

MainActivity.java

package cn.dxoca.viewmodelresort;

import cn.dxoca.viewmodelresort.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

MyViewModel myViewModel;

ActivityMainBinding binding;

final static String KEY_NUMBER = "my_number";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

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

//后台杀死后数据依然存活

if (savedInstanceState != null)//通过key取回整数 设置到number变量中

{//判空再取值,取回数据

myViewModel.getNumber().setValue(savedInstanceState.getInt(KEY_NUMBER));

Log.d("tag", "onCreate: Recover Key_number");

}

binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

binding.setData(myViewModel);

binding.setLifecycleOwner(this);

}

@Override

protected void onSaveInstanceState(@NonNull Bundle outState) {

super.onSaveInstanceState(outState);

outState.putInt(KEY_NUMBER, myViewModel.getNumber().getValue());

}

}

MyViewModel.java

package cn.dxoca.viewmodelresort;

import androidx.lifecycle.MutableLiveData;

import androidx.lifecycle.SavedStateHandle;

import androidx.lifecycle.ViewModel;

public class MyViewModel extends ViewModel {

private MutableLiveData number;

public MutableLiveData getNumber() {

if (number == null) {

number = new MutableLiveData<>();

number.setValue(0);

}

return number;

}

/**

* 累加

*/

public void add() {

number.setValue(number.getValue() + 1);

}

}

新方法 ViewModel Savedstate

27cf3b2a05fa8d13467bb6ba32bbedb2.png

即便应用程序在后台被杀死的情况下,viewModel数据任然可以存活,不会轻易丢失,数据更健康

ViewModel-SavedState API:

https://developer.android.com/jetpack/androidx/releases/lifecycle#viewmodel-savedstate-1.0.0

在gradle dependencies中写入

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

MainActivity.java

package cn.dxoca.viewmodelresort;

import androidx.appcompat.app.AppCompatActivity;

import androidx.databinding.DataBindingUtil;

import androidx.lifecycle.ViewModelProvider;

import android.os.Bundle;

import cn.dxoca.viewmodelresort.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

MyViewModel myViewModel;

ActivityMainBinding binding;

public final static String KEY_NUMBER = "my_number";//声明为public 全局试用(MyViewModel中)

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

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

binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

binding.setData(myViewModel);

binding.setLifecycleOwner(this);

}

}

MyViewModel.java

package cn.dxoca.viewmodelresort;

import androidx.lifecycle.MutableLiveData;

import androidx.lifecycle.SavedStateHandle;

import androidx.lifecycle.ViewModel;

public class MyViewModel extends ViewModel {

//当ViewModel被摧毁的时候通过SavedStateHandle 在重新创建ViewModel的时候 重构数据 并传递过来

private SavedStateHandle handle;

public MyViewModel(SavedStateHandle handle) {

this.handle = handle;

}

public MutableLiveData getNumber() {//ViewModel请求这个数的时候

if (!handle.contains(MainActivity.KEY_NUMBER)) {//判断handle变量有没有包含key名称的数据(不包含Key)

handle.set(MainActivity.KEY_NUMBER, 0);//没有就 初始化为0

}

return handle.getLiveData(MainActivity.KEY_NUMBER);

}

/**

* 累加

*/

public void add() {

getNumber().setValue(getNumber().getValue() + 1);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值