使用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. Linux下搭建keepalive+nginx

    一. 安装nginx(略) 二. 安装keepalive 下载http://www.keepalived.org/download.html 安装依赖包 yum install –y popt* gc ...

  2. ASP.NET 后台 COOKIE 的设置

    这几年经常与安全打交道,深知 COOKIE 对一个网站的安全影响有多大,所以在编写相与 cookie 相关代码的时候,都会特别的小心. 最近做一个系统,有几个地方用到 cookie, 然后统一把 co ...

  3. BUAA-OO-2019 第三单元总结

    JML语言理论基础梳理及工具链 注释结构 JML以javadoc注释的方式来表示规格,每行都以@起头. 行注释://@annotation 块注释:/* @ annotation @*/ JML表达式 ...

  4. web和网络基础

    TCP/IP 协议族按层次分别分为以下 4 层: 应用层. 传输层. 网络层和数据链路层 把 TCP/IP 层次化是有好处的. 比如, 如果互联网只由一个协议统筹, 某个地方需要改变设计时, 就必须把 ...

  5. 英语partschinite芬达石partschinite锰铝榴石

    partschinite指锰铝榴石,属于石榴石的一种,由于它有芬达饮料的诱人颜色,大家也称其为“芬达石”.石榴石宝石族中重要品种之一,化学成分为锰铝硅酸盐,颜色从红到橙红,红到棕红,玫瑰红.浅玫红均有 ...

  6. Unity手游汉化笔记③:UABE替换BMFont

    总的笔记:https://www.cnblogs.com/guobaoxu/p/12055930.html 目录 一.Demo 二.分析思路 三.替换 四.总结 五.补充 工具: Unity版本:20 ...

  7. Node初识

    初识Nodejs Node.js的诞生 作者Ryan Dahl 瑞恩·达尔 2004 纽约 读数学博士 2006 退学到智利 转向开发 2009.5对外宣布node项目,年底js大会发表演讲 2010 ...

  8. es倒排索引原理解析

    倒排索引原理 普通的存储方式是给每个文档编一个序号 然后让这个序号对应单个文档的所有内容  如果用这样的方式查找   当需要查找某个单词的时候需要遍历所有的文档集合 查找文档的效率会非常的慢 2.基本 ...

  9. 数据结构与算法5—KMP算法

    串的模式匹配算法 子串(模式串)的定位操作通常称为串的模式匹配. 这是串的一种重要操作,很多 软件,若有“编辑”菜单项的话, 则其中必有“查找”子菜单项. 串的顺序存储实现 #include<s ...

  10. sqlserver一次性修改多条

    修改客户表 编号为 0101007002,0101007003的楼栋号  007-1-102,007-1-201 UPDATE gas_customerSET building= CASEWHEN g ...