转载地址:http://blog.csdn.net/zhichu_2025/article/details/52047605

有a、b两个activity,当a进入b之后的一段时间,可能系统就把a回收了,这时候按back键,执行的不是a的onStart()方法,而是onCreate()方法,a被重新创建了一次,这时a的临时数据和状态就很有可能就丢失了。

而Activity中的onSaveInstanceState()回调方法会保存临时的数据和状态,这个方法一定会再activity回收之前调用。方法中有一个Bundle参数,putString()、putInt()等方法需要传入两个参数,一个键一个值。数据保存之后会在onCreate中会恢复,onCreate也有一个Bundle类型的参数。

示例代码:

[java] view plaincopy
  1. protected void onCreate(Bundle savedInstanceState){
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.activity_main);
  4. //      当activity第一次被创建的时候为空
  5. //      所以我们来判断一下
  6. if(savedInstanceState != null){
  7. savedInstanceState.getString("anAnt");
  8. }
  9. protected void onSaveInstanceState(Bundle outState){
  10. super.onSaveInstanceState(outState);
  11. outState.putString("anAnt","Android");
  12. }

一、onSaveInstanceState(Bundle outState)    用来保存状态

当某个activity变得“”容易“被系统销毁时,该activity的onSaveInstanceState()就会被执行,除非这个activity是被用户主动销毁的,例如用户按BACK键时。

“容易”被销毁时什么意思呢??

言下之意就是此时的activity还没有被销毁,而仅仅是一种可能性,这种可能性有哪些呢??通过重写一个activity的所有生命周期的onXXX()方法,包括onSaveInstanceState()和onRestoreInstanceState()方法,我们可以清楚的知道某个activity(假设为activity A)显示在当前task的最上层,其onSaveInstanceState()方法会在什么时候被执行,有这么几种情况:

1、当用户按下HOME键时。这是显而易见的,系统不知道当你按下HOME后要运行多少个其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则

2、长按HOME键,选择运行其他的程序时

3、按下电源按键(关闭屏幕显示)时

4、从一个activity A中启动一个新的activity时

5、屏幕方向切换时,l例如从竖屏切换到横屏时。(如果不指定configchange属性)在屏幕切换之前,系统会销毁activity A,在切换之后系统又会自动地创建activity A,所以onSavaInstanceState一定会被执行

总而言之,onSaveInstanceState的调用遵循一个重要原则,就是系统未经你允许就销毁你的activity,那么onSaveInstanceState一定会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据。另外,注意几点:

1.布局中的每一个view默认实现了onSaveInstanceState()方法,这样的话,这个UI的任何改变都会自动的存储和在activity重新创建的时候自动恢复。但是这个情况只有你为这个UI提供了唯一的ID之后才会起作用,如果没有ID,则不会存储它的状态

2.由于默认的onSaveInstanceState()方法实现了帮助UI存储它的状态,所以如果你需要覆盖这个方法去存储额外的状态信息时,你应该在执行任何代码之前都调用父类的onSaveInstanceState()方法,(super.onSaveInstanceState).

既然有现成的可以用,那我们到底要不要自己来实现onSaveInstanceState()方法呢??这个分情况而定,如果你自己的派生类中有变量影响到UI,或是你程序的行为,当然也要把这个变量也保存了,那么就需要自己实现,否则不需要。

3.由于onSaveInstanceState()方法调用的不可确定性,你应该只使用这个方法去记录activity的瞬间状态(UI的状态),不应该用这个方法去存储持久化数据。当用户离开这个activity的时候应该在onPause()方法中存储持久化数据(例如应该被存储到数据库中的数据)

4.onSaveInstanceState()如果被调用,这个方法会在onStop()前被触发,但是系统并不保证是否在onPause()之前或者是之后触发

二、onRestoreInstanceState(Bundle outState)   用来恢复数据

需要注意的是,onSaveInstanceState和onRestoreInstanceState并不一定是成对被调用的

onRestoreInstanceState()被调用的前提是,activity A 确实已经被销毁了,而如果仅仅是停留在可能情况下,那么该方法不会被调用。

例如,正在显示activity A 的时候,按下HOME键回到了主界面,然后紧接着又返回activity A,这种情况下,活动一般不会因为内存的原因而被系统销毁,故onRestoreInstanceState方法不会执行。

另外,onRestoreInstanceState的bundle参数也会传到onCreate()中,你也可以选择在onCreate()方法中做数据还原。此方法在onStart()方法之后执行。

以下的两个函数的使用,注意调用super的前后!!!!

[java] view plaincopy
  1. public void onSaveInstanceState(Bundle savedInstanceState){
  2. savedInstanceState.putBoolean("MyBoolean",true);
  3. saveInstanceState.putDouble("MyDouble",1.9);
  4. savedInstanceState.putInt("MyInt",1);
  5. savedInstanceState.putString("MyString","Android");
  6. super.onSaveInstanceState(savedInstanceState);
  7. }
  8. public void onRestoreInstanceState(Bundle savedInstanceState){
  9. super.onRestoreInstanceState(savedRestoreInstanceState);
  10. boolean myBoolean = saveInstanceState.getBoolean("MyBoolean");
  11. double myDouble = saveInstanceState.getDouble("MyDouble");
  12. int myInt = saveInstanceState.getInt("MyInt");
  13. }
  14. protected void onCreate(Bundle savedInstanceState){
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_main);
  17. //      当activity第一次被创建的时候为空
  18. //      所以我们来判断一下
  19. if(savedInstanceState != null){
  20. savedInstanceState.getString("anAnt");
  21. }
  22. }

Activity的缓存方法相关推荐

  1. 正确退出activity_【单选题】下面退出 Activity 错误的方法是

    [单选题]下面退出 Activity 错误的方法是 更多相关问题 听对话,根据对话内容补全句中所缺的单词.1. Rose needs apples.2. The boy is making a ban ...

  2. Activity的setResult方法

    Activity的setResult方法 http://blog.csdn.net/dinglin_87/article/details/8970144 调用setResult()方法必须在finis ...

  3. View的生命周期方法和Activity生命周期方法关系

    View 是在Activity 中使用到的,所以在自定义View的时候,我们需要了解Activity 生命周期方法和View的生命周期方法调用先后顺序.  见如下图 (1) 在Activity onC ...

  4. 使用JCache缓存方法结果

    在JCache中,有一个方便的功能可以透明地缓存方法的结果. 您可以使用@CacheResult注释托管bean的方法,并且将再次返回第一次调用的结果,而无需再次调用实际方法. import java ...

  5. android 退出多个activity,Android 中 退出多个activity的经典方法

    1.使用list集合方式 用list保存activity实例,然后逐一干掉 import java.util.linkedlist; import java.util.list; import and ...

  6. Activity生命周期方法的调用顺序project与測试日志

    以下为測试activity的方法的运行顺序   project与測试资源地址 androidproject AndroidManifest.xml <? xml version="1. ...

  7. 覆写Activity的finish()方法

    MainActivity如下: package cn.testfinish; import android.app.Activity; import android.os.Bundle; import ...

  8. Android开机启动Activity或者Service方法

    这段时间在做Android的基础开发,现在有一需求是开机启动,按照网上某些博文教程做了下,始终不成功,一开机总是提示所启动的应用程序意外终止,于是参考了Android SDK doc,终于解决问题,下 ...

  9. java 缓存方法_Java实现一个简单的缓存方法

    Java实现一个简单的缓存方法 发布时间:2020-09-07 21:39:55 来源:脚本之家 阅读:99 作者:BrightLoong 缓存是在web开发中经常用到的,将程序经常使用到或调用到的对 ...

最新文章

  1. 闲话WPF之十五(WPF的数据处理 [2])
  2. php获取用户的上5级用户
  3. 【离散数学】二元关系的闭包
  4. LaTeX之参考文献的写法
  5. 大型情感剧集Selenium:3_元素定位 #华为云·寻找黑马程序员#
  6. skhynix nvme toolbox怎么选择磁盘_为啥我的NVMe固态硬盘跑分比别人少一半!?莫慌,2张图完美解决...
  7. 57. TCP relay功能描述及Python实现
  8. 更改一个主键的列的类型的步骤
  9. zynq中interrupts的学习笔记(一)
  10. spring boot 教程(五)使用JdbcTemplate访问数据库
  11. [转载] c++ cout 格式化输出浮点数、整数及格方法
  12. 联想微型计算机如果进入BIos,联想笔记本各机型如何进入bios
  13. 一种基于Android、iOS系统的移动端身份证识别技术,手机拍照扫描识别
  14. 计算机本科必备知识基础知识,计算机基础知识(本科).doc
  15. ORA-00932:数据类型不一致:应为NUMBER,但却获得CHAR
  16. jeff dean_Jeff Dean的构建大型分布式系统的软件工程建议
  17. 用PaddlePaddle进行图像分割
  18. DM36x 接入 AR0130 sensor
  19. 河北工程科技学院计算机专业,计算机科学与技术系与河北工程大学信息与电气工程学院联合召开一流专业建设交流会...
  20. Mining Version Histories to Guide Software Cha(挖掘版本记录以指导软件更改论文注解)

热门文章

  1. 基于用户投票的排名算法(一):Delicious和Hacker News
  2. ubuntun安装ssh,并远程链接服务器操作
  3. audio 标签简介
  4. 服务器内存延迟,内存带宽、延迟性能测试
  5. wget 地址 连接超时_HttoPool连接池 和Hystrix 服务容错机制
  6. 用计算机三级处理文件,【题目】计算机三级题目,献给为计算机三级挣扎的同学们...
  7. 深度学习之数据增强方案和TensorFlow操作
  8. Colemak布局的实现 Window+Linux+Android
  9. 【Python的黑魔法】实例方法、静态方法和类方法
  10. Django Model设计详解