一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的全部信息和状态数据不会消失, 当activity又一次回到前台之后, 全部的改变都会得到保留.

可是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 假设之后这个activity又一次回到前台, 之前所作的改变就会消失. 为了避免此种情况的发生, 开发人员能够覆写onSaveInstanceState()方法. onSaveInstanceState()方法接受一个Bundle类型的參数, 开发人员能够将状态数据存储到这个Bundle对象中,
这样即使activity被系统摧毁, 当用户又一次启动这个activity而调用它的onCreate()方法时, 上述的Bundle对象会作为实參传递给onCreate()方法, 开发人员能够从Bundle对象中取出保存的数据, 然后利用这些数据将activity恢复到被摧毁之前的状态.

  1. public static final int SECOND_ACTIVITY = 0;
  2. private String temp;
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. // 从savedInstanceState中恢复数据, 假设没有数据须要恢复savedInstanceState为null
  7. if (nul!=savedInstanceStatel&&savedInstanceState.containKey("temp")) {
  8. temp = savedInstanceState.getString("temp");
  9. System.out.println("onCreate: temp = " + temp);
  10. }
  11. }
  12. public void onResume() {
  13. super.onResume();
  14. temp = "xing";
  15. System.out.println("onResume: temp = " + temp);
  16. // 切换屏幕方向会导致activity的摧毁和重建
  17. if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {
  18. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  19. System.out.println("屏幕切换");
  20. }
  21. }
  22. // 将数据保存到outState对象中, 该对象会在重建activity时传递给onCreate方法
      这样就保存到了Bundle中,即使Activity被kill掉了,Bundle仍然存在
  23. @Override
  24. protected void onSaveInstanceState(Bundle outState) {
  25. super.onSaveInstanceState(outState);
  26. outState.putString("temp", temp);
  27. }
  28. }


须要注意的是, onSaveInstanceState()方法并非一定会被调用的, 由于有些场景是不须要保存状态数据的. 比方用户按下BACK键退出activity时, 用户显然想要关闭这个activity, 此时是没有必要保存数据以供下次恢复的, 也就是onSaveInstanceState()方法不会被调用. 假设调用onSaveInstanceState()方法, 调用将发生在onPause()或onStop()方法之前.

onSaveInstanceState()方法的默认实现

假设开发人员没有覆写onSaveInstanceState()方法, 此方法的默认实现会自己主动保存activity中的某些状态数据, 比方activity中各种UI控件的状态. android应用框架中定义的差点儿全部UI控件都恰当的实现了onSaveInstanceState()方法, 因此当activity被摧毁和重建时, 这些UI控件会自己主动保存和恢复状态数据. 比方EditText控件会自己主动保存和恢复输入的数据, 而CheckBox控件会自己主动保存和恢复选中状态.
开发人员仅仅须要为这些控件指定一个唯一的ID(通过设置android:id属性就可以), 剩余的事情就能够自己主动完毕了. 假设没有为控件指定ID, 则这个控件就不会进行自己主动的数据保存和恢复操作.

由上所述, 假设开发人员须要覆写onSaveInstanceState()方法, 通常会在第一行代码中调用该方法的默认实现: super.onSaveInstanceState(outState).

是否须要覆写onSaveInstanceState()方法

既然该方法的默认实现能够自己主动的保存UI控件的状态数据, 那什么时候须要覆写该方法呢?

假设须要保存额外的数据时, 就须要覆写onSaveInstanceState()方法. 如须要保存类中成员变量的值(见上例).

onSaveInstanceState()方法适合保存什么数据

因为onSaveInstanceState()方法方法不一定会被调用, 因此不适合在该方法中保存持久化数据, 比如向数据库中插入记录等. 保存持久化数据的操作应该放在onPause()中. onSaveInstanceState()方法仅仅适合保存瞬态数据, 比方UI控件的状态, 成员变量的值等.

引发activity摧毁和重建的其它情形

除了系统处于内存不足的原因会摧毁activity之外, 某些系统设置的改变也会导致activity的摧毁和重建. 比如改变屏幕方向(见上例), 改变设备语言设定, 键盘弹出等.

保存Activity的状态的更多相关文章

  1. 如何保存 Activity 的状态?

    Activity 的状态通常情况下系统会自动保存的,只有当我们需要保存额外的数据时才需要使用到这样的功能.一般来说, 调用 onPause()和 onStop()方法后的 activity 实例仍然存 ...

  2. Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)

    一.什么是Activity? 简单的说:Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面.在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的Ac ...

  3. Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)

    一.什么是Activity? 简单的说:Activity或者悬浮于其它窗体上的交互界面. 在一个应用程序中通常由多个Activity构成.都会在Manifest.xml中指定一个主的Activity, ...

  4. Android开发之InstanceState详解(转)---利用其保存Activity状态

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  5. Android中activity保存数据和状态在哪个方法实现

    以前只知道在Activity销毁之前,要把数据保存在 onSaveInstanceState(Bundle)方法中,后来学习了别人的微博,学到了很多细节问题,所以整理了一下,希望能帮到大家. 如果看官 ...

  6. 【转】android笔记--保存和恢复activity的状态数据

    一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会 ...

  7. Android基础部分再学习---activity的状态保存

    主要是bundle   这个參数 參考地址:http://blog.csdn.net/lonelyroamer/article/details/18715975 学习Activity的生命周期,我们知 ...

  8. Android 保存和恢复activity的状态数据

    一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会 ...

  9. android中正确保存view的状态

    英文原文: http://trickyandroid.com/saving-android-view-state-correctly/ 转载此译文须注明出处. 今天我们聊一聊安卓中保存和恢复view状 ...

随机推荐

  1. jsp中session执行机制

  2. Python--10、生产者消费者模型

    生产者消费者模型(★) 平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度.程序中有两类角色:生产数据.消费数据实现方式:生产->队列->消费. 通过一个容器来解决生产者和消费 ...

  3. asp.net——统计输入的字符数目

    asp.net——统计输入的字符数目 题目: 在页面中有一个TextBox输入框,一个显示文字用的Label,一个提交按钮Button.在TextBox中输入一段英文字母,点击按钮提交后统计其中字母‘ ...

  4. html5——应用缓存

    基本概念 1.HTML5中我们可以轻松的构建一个离线(无网络状态)应用,只需要创建一个cache manifest文件 2.可配置需要缓存的资源,网络无连接应用仍可用,本地读取缓存资源,提升访问速度, ...

  5. 想学Python?这里有一个最全面的职位分析

    Python从2015年开始,一直处于火爆的趋势,目前Python工程师超越Java.Web前端等岗位,起薪在15K左右,目前不管是小公司还是知名大公司都在热招中. 当然,每个城市对岗位的需求也不尽相 ...

  6. 【Apache Kafka】二、Kafka安装及简单示例

    (一)Apache Kafka安装 1.安装环境与前提条件   安装环境:Ubuntu16.04   前提条件: ubuntu系统下安装好jdk 1.8以上版本,正确配置环境变量 ubuntu系统下安 ...

  7. HTML 符号实体

    带有实体名称的 ASCII 实体 结果 描述 实体名称 实体编号 " quotation mark " " ' apostrophe  ' ' & ...

  8. Linux之强大的selinux

    简单点说,SELinux就是用来加强系统安全性的.它给一些特定程序(这些程序也在不断增加)做了一个沙箱,它将文件打上了一个安全标签,这些标签属于不同的类,也只能执行特定的操作,也就是规定了某个应用程序 ...

  9. Problem 63

    Problem 63 https://projecteuler.net/problem=63 Powerful digit counts The 5-digit number, 16807=75, i ...

  10. Keil-MDK编译完成后代码大小

    Code 代表执行的代码,程序中所有的函数都位于此处. RO-data 代表只读数据,程序中所定义的全局常量数据和字符串都位于此处. RW-data 代表已初始化的读写数据,程序中定义并且初始化的全局 ...