使用ViewMode SavedState来使得ViewModel在系统杀死后台进程的时候得以存活。

本集使用到的库,需要在gradle中添加: implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-alpha01'

方法1:只用 savedInstanceState

package com.example.viewmodelrestore;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.SavedStateVMFactory;
import androidx.lifecycle.ViewModelProviders; import com.example.viewmodelrestore.databinding.ActivityMainBinding; public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
MyViewModel myViewModel;
public final static String KEY_NUMBER = "my_number"; //常量 /*
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
利用 ViewModel 进行保存数据,横屏切换后,数据都会保存
但是如果Activity 杀死后,重新打开,数据就没有了。 binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
//ViewModelProviders 需要在 build.gradle 中 添加如下引用:
//implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
binding.setData(myViewModel);
binding.setLifecycleOwner(this);
这种是之前老的 api 中的方法 使用 onSaveInstanceState 键值对 ,进入后台,再回到app,数据还会显示之前的
新的方法是在 build.gradle 中引用 implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-alpha01'
在 MyViewModel 类中 添加一个构造函数
使用:SavedStateHandle handle
SavedStateHandle.getLiveData
*/ @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main); binding = DataBindingUtil.setContentView(this,R.layout.activity_main); //ViewModelProviders 需要在 build.gradle 中 添加如下引用:
//implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0' //判断是否有数据,如果有直接取出来
//用 SaveInstanceState 就不需要用下面这个了
/*
【1】:老方法
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
if(savedInstanceState != null){
myViewModel.getNumber().setValue(savedInstanceState.getInt(KEY_NUMBER));
}
*/ //新方法【2】:直接用这句,就不需要判断为不为空了
//需要在 build.gradle 中引用 implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-alpha01'
//注意创建 ViewModel 对象的时候,要带一个参数 : new SavedStateVMFactory(this)
myViewModel = ViewModelProviders.of(this,new SavedStateVMFactory(this)).get(MyViewModel.class); binding.setData(myViewModel);
binding.setLifecycleOwner(this);
} //将数据保存起来
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(KEY_NUMBER,myViewModel.getNumber().getValue());
}
}

  

ViewModel 类

package com.example.viewmodelrestore;

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.SavedStateHandle;
import androidx.lifecycle.ViewModel; public class MyViewModel extends ViewModel {
//【老方法】
private MutableLiveData<Integer> number;

//【新方法】
private SavedStateHandle handle;
public MyViewModel(SavedStateHandle handle) {
this.handle = handle;
} public MutableLiveData<Integer> getNumber() {
//【新方法】
//判断 handld 键值组里面有没有这个
if(!handle.contains(MainActivity.KEY_NUMBER)){
handle.set(MainActivity.KEY_NUMBER,0);
}
return handle.getLiveData(MainActivity.KEY_NUMBER); /* 【老方法】,不用 MyViewModel 构造函数的情况下,不使用 SaveStateHandle
if(number == null)
{
number = new MutableLiveData<>();
number.setValue(0);
}
return number;
*/
}
public void add(){
//【新方法】
getNumber().setValue(getNumber().getValue() + 1);

//【老方法】
//number.setValue(number.getValue() + 1);
}
}

  

Android Studio 之 数据存活【2】,返回桌面切换回来,内容还保存着的更多相关文章

  1. Android Studio 点击两次返回键,退出APP

    该功能的实现没有特别复杂,主要在onKeyDown()事件中实现,直接上代码,如下: //第一次点击事件发生的时间 private long mExitTime; /** * 点击两次返回退出app ...

  2. android studio中Fragment使用webview返回上一页的问题

    在Fragment中使用了腾讯的X5 webview,虽然好用,但是在Fragment中传递消息困难,想要返回上一页,还得各种消息传递什么的,麻烦.可是在Fragment中又不能使用onKeyDown ...

  3. Android Studio之多个Activity的滑动切换(二)

    1.因为Android界面上的全部控件一般都位于Layout控件(比方RelativeLayout)之上,而布局控件能够设置响应touch事件,所以能够通过布局控件的setOnTouchListen来 ...

  4. Android Studio Xposed模块编写(一)

    1.环境说明 本文主要参考https://my.oschina.net/wisedream/blog/471292?fromerr=rNPFQidG的内容,自己实现了一遍,侵权请告知 已经安装xpos ...

  5. 建立企业内部mavenserver并使用Android Studio公布公共项目

    由于Android Studio使用了Gradle构建工具,在library依赖的处理上是将被依赖的library作为一个module引入(拥有一份完整的library拷贝),而Eclipse的ADT ...

  6. 加速Android Studio的Gradle构建速度

    在利用Android Studio做项目时,发现随着项目内资源的逐渐增多(或者项目创建时间太过久远,而又未经常打开),Android Studio的build速度也越来越慢.(P.S.在做我的CSGO ...

  7. Android Studio 一个完整的APP实例(附源码和数据库)

    前言: 这是我独立做的第一个APP,是一个记账本APP. This is the first APP, I've ever done on my own. It's a accountbook APP ...

  8. centos 装 android studio

    一.安装前的准备 1.1.如果你还没有安装ubuntu 14.04 LTS系统,请参考下面的文章安装 http://blog.csdn.net/lsyz0021/article/details/521 ...

  9. OpenCV On Android环境配置最新&最全指南(Android Studio篇)

    本文是从本人简书上搬运而来,属本人原创,如有转载,请注明出处:http://www.jianshu.com/p/6e16c0429044 简介 本文是<OpenCV On Android环境配置 ...

随机推荐

  1. http的GET方法参数中不能传列表,接收端的key会变

    如下 async initTable() { await getHostAttributesForUser({'username': this.username}).then(response =&g ...

  2. 2019 中至数据java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.中至数据等公司offer,岗位是Java后端开发,因为发展原因最终选择去了中至数据,入职一年时间了,也成为了面 ...

  3. webpack 入门和常用插件的使用

    常用配置参数 module.exports = { context: path.resolve(__dirname, '../'), entry: { app: './src/main.js' }, ...

  4. JavaWeb第一天--HTML

    HTML HTML简介 HTML(Hyper TextMarkupLanguage) 超文本标记语言. 超文本: 超越了文本仅仅展示信息的功能范畴,泛指:图片.有样式的文字.超链接. 标记: 标签. ...

  5. Springboot jpa多数据源

    1.SpringBootApplication package com.xx.xxx; import org.springframework.beans.factory.annotation.Auto ...

  6. docker中安装及使用mysql

    打算构造一个环境较全的linux环境,所以在本地弄了个docker.然后pull了一个centos的镜像,并打算在此镜像的基本上,构建适合自己的镜像.但在使用时,发现了各种问题,还是费了一些功夫.原因 ...

  7. 微信小程序引入外部组件 iView Weapp

    iview Weapp组件的使用方法: 1. 下载小程序组件库 (前提是你已经有了项目目录) 你可以直接去github把iView Weapp的代码下载下来,也可以用过npm来下载. github地址 ...

  8. [加密]非对称加密STM32实现

    转自:https://blog.csdn.net/kangerdong/article/details/82432701 把所有的准备工作都做完了以后,可以将加密算法移植到我们具体的项目中去了,在ST ...

  9. C/C++函数调用时传参过程与可变参数实现原理

    C/C++函数调用时传参过程与可变参数实现原理 C语言的经典swap问题 在学习C语言的时候,我们大都遇到过一些经典例题,这些经典例题背后所代表的是往往是C/C++背后的一些运行原理,比如下面这个示例 ...

  10. 1.探索性数据分析(EDA,Exploratory Data Analysis)

    一.数据探索 1.数据读取 遍历文件夹,读取文件夹下各个文件的名字:os.listdir() 方法:用于返回指定的文件夹包含的文件或文件夹的名字的列表.这个列表以字母顺序. 它不包括 '.' 和'.. ...