Activity临时数据的保存是非常重要的,例如:一款小说APP应用,读者使用这款APP看到了223页,用户也没有去记看了多少页;

突然去接了个电话,或者开启的应用程序太多了,可能会导致这款APP应用程序的Activity被系统杀死回收了,当用户打完电话 再次打开这款APP的时候,又从第一页开始了,这样体验非常不好,所以需要去保存Activity的临时数据


在Activity中 onSaveInstanceState(Bundle outState)方法用Bundle保存数据,可以在onCreate(Bundle savedInstanceState)方法用Bundle恢复数据,注意要判断Bundle是否为空

package liudeli.activity.temp_data;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log; import liudeli.activity.R; public class TempDataActivity extends Activity { private final String TAG = TempDataActivity.class.getSimpleName(); /**
* 定义页数变量
*/
private int page; /**
* 此方法不仅仅可以初始化数据
* 还可以恢复保存的临时数据
* @param savedInstanceState onSaveInstanceState方法 保存的临时数据就存放在Bundle里面
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_temp_data); // 为什么要null判断,因为没有保存临时数据的时候,Bundle是null
// 所以第一次初始化一定是null
if (null != savedInstanceState) {
page = savedInstanceState.getInt("page");
Log.d(TAG, "onCreate 上次看到了" + page + "页");
} Log.d(TAG, "onCreate");
} /**
* 例如:当系统内存不足的时候,切换其他游戏应用程序 在玩游戏,有可能当前的Activity会被回收杀死
* 一旦出现回收杀死Activity就会调用此方法,然后在此方法保存临时数据
* @param outState
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// 用户看到223页
page = 223;
outState.putInt("page", page);
} /**
* 恢复保存的临时数据
* @param savedInstanceState onSaveInstanceState方法 保存的临时数据就存放在Bundle里面
*/
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// 这个方法不需要判断savedInstanceState null,因为不可能为null,只有保存过数据,再次打开Activity才会调用此方法
page = savedInstanceState.getInt("page");
Log.d(TAG, "onRestoreInstanceState 上次看到了" + page + "页");
} /******* 下面是一系列生命周期方法,用来观察,Activity被系统杀死,又重写启动的Log打印 ******/ @Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart");
} @Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
} @Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
} @Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop");
} @Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
}

如何才能让这个Activity被系统杀死回收呢?

答:如果要测试的话,可以用模拟器 横竖屏切换一下,Activity就被杀死,然后自动重新启动Activity

以上图 横竖屏切换后,系统会默认会把Activity杀死回收,所以执行以下方法:

  12-12 08:11:50.441 3347-3347/liudeli.activity D/TempDataActivity: onPause
  12-12 08:11:50.441 3347-3347/liudeli.activity D/TempDataActivity: onStop
  12-12 08:11:50.441 3347-3347/liudeli.activity D/TempDataActivity: onDestroy

  系统会自动启动这个Activity,请看下面的Log
  12-12 08:11:50.460 3347-3347/liudeli.activity D/TempDataActivity: onCreate 上次看到了223页
  12-12 08:11:50.460 3347-3347/liudeli.activity D/TempDataActivity: onCreate
  12-12 08:11:50.460 3347-3347/liudeli.activity D/TempDataActivity: onStart
  12-12 08:11:50.460 3347-3347/liudeli.activity D/TempDataActivity: onRestoreInstanceState 上次看到了223页
  12-12 08:11:50.460 3347-3347/liudeli.activity D/TempDataActivity: onResume

Android-Activity临时数据的保存的更多相关文章

  1. android应用的数据应该保存到哪儿

    王永超王永超嫖娼 做android app开发会涉及到不同数据的保存,比如数据缓存,客户登陆信息保存,客户状态的保存等等. 那针对这不同的数据我们应该保存在什么地方呢? 1.应用卸载也不会删除的数据 ...

  2. Android activity之间数据传递和共享的方式之Application

    1.基于消息的通信机制  Intent ---bundle ,extra 数据类型有限,比如遇到不可序列化的数据Bitmap,InputStream,或者LinkedList链表等等数据类型就不太好用 ...

  3. Android Activity 传递数据

    activity中数据的传递方式有2中,一种是使用putExtra()传递,另外一种是传递Bundle对象,使用putExtras()方法. 方法一 发送数据 putExtra()传送的是键值对,第一 ...

  4. Android开发学习---android下的数据持久化,保存数据到rom文件,android_data目录下文件访问的权限控制

    一.需求 做一个类似QQ登录似的app,将数据写到ROM文件里,并对数据进行回显. 二.截图 登录界面: 文件浏览器,查看文件的保存路径:/data/data/com.amos.datasave/fi ...

  5. android Activity之间数据传递 Parcelable和Serializable接口的使用

    Activity之间传数据时,为了避免麻烦,往往会将一些值封装成对象,然后将整个对象传递过去.传对象的时候有两种情况,一种是实现Parcelable接口,一种是实现Serializable接口.0.解 ...

  6. 简单的三方登录SDK示例,Android Activity之间数据的传递

    先建立Library工程,即普通工程然后在Android的属性勾选Library选项. 这里建立的工程为 mySdk ,Activity名为LoginActivity. LoginActivity代码 ...

  7. Android Activity传递数据使用getIntent()接收不到,揭秘Intent传递数据与Activity启动模式singleTask的关系。

    activity通过intent传递数据的时候,如果activity未启动,那么在这个刚启动的activity里通过getIntent()会获取到这个intent的数据.. 如果要启动的activit ...

  8. android activity在横竖屏切换的时候不重新调用onCreate方法

    在安卓系统中,横竖屏切换会默认重新调用onCreate等生命周期方法,如果此时有一些临时数据没有保存下来,很有可能会导致该数据丢失. 因此我们可以进行以下设置,来避免恒切换时重新调用onCreate方 ...

  9. Android中突发情况Activity数据的保存和恢复

    Android中突发情况Activity数据的保存和恢复 写在前面:在我们的APP使用的过程中,总有可能出现各种手滑.被压在后台.甚至突然被杀死的情况.所以对APP中一些临时数据或关键持久型数据,就需 ...

随机推荐

  1. bower的安装和使用

    第一 下载node 网址https://nodejs.org/en/ 安装过程基本直接“NEXT”就可以了. 安装完成之后,我们先检测下NodeJS是否安装成功,cmd命令行中键入: node -v ...

  2. NLTK与自然语言处理基础

    NLTK (Natural Language Toolkit) NTLK是著名的Python自然语言处理工具包,但是主要针对的是英文处理.NLTK配套有文档,有语料库,有书籍. NLP领域中最常用的一 ...

  3. MVC项目不同域之间的UrlRouting

    一.DomainAction,方便生成不同域下的url 1.新建3个MVC项目,一个公用类库WebCore Demo.WebApplication0 绑定域名 www.demo.com demo.co ...

  4. Linux下的service命令和chkconfig命令的原理

    CentOS下的service命令和chkconfig命令的原理 1.service命令的原理 service命令用来对服务进行启动和关闭,比如service mysqld start可以启动mysq ...

  5. 基于NodeJS的14款Web框架

    摘要: 在几年的时间里,Node.js逐渐发展成一个成熟的开发平台,吸引了许多开发者.有许多大型高流量网站都采用Node.js进行开发,像PayPal, 此外,开发人员还可以使用它来开发一些快速移动W ...

  6. 201671010140. 2016-2017-2 《Java程序设计》java学习第十四周

      java学习第十四周       本周,主要精力放在了第十二章swing用户界面组件知识的学习,swing是一个用于开发Java应用程序用户界面的开发工具包.它以抽象窗口工具包(AWT)为基础使跨 ...

  7. jsp实现查询与展示功能

    今天做了一天的这个功能,开始是数据库一直打不开,显示Class not  found,一直调试,调试了一下午.原来是mysql的jar包,必须要放到WEB-INF这个目录下的lib文件夹中,然后bui ...

  8. fidder 自动保存请求内容

    背景: 因为公司有有app和sdk,这些项目没有对应的接口统计.重构的时候很容易忽略掉.所以对fiddler写了一点代码,能将请求的数据写入到文件或者数据库中.方便统计接口,下次重构的时候,方便统计影 ...

  9. 297. Serialize and Deserialize Binary Tree二叉树的序列化和反序列化(就用Q)

    [抄题]: Serialization is the process of converting a data structure or object into a sequence of bits ...

  10. 275. H-Index II 递增排序后的论文引用量

    [抄题]: Given an array of citations in ascending order (each citation is a non-negative integer) of a ...