一般来说, 调用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. 大数据插入Excel报错处理

    发现问题: 最近运行程序时,发现了一个问题,就是在导出excel时,报了一下错误 分析问题: 原来是由于NPOI这个动态库导致的,然后看了下版本,发现是1.2.5.然后百度了下,发现这个版本的NPOI ...

  2. 在Django中使用redis:包括安装、配置、启动。

    一.安装redis: 1.下载: wget http://download.redis.io/releases/redis-3.2.8.tar.gz 2.解压 tar -zxvf redis-.tar ...

  3. 增加删除div

    <!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...

  4. [转]STL之vector容器详解

    vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说: ...

  5. 如何用putty链接服务器端,并安装wdcp

    首先把自己阿里云的磁盘格式化然后重启 自己下载一个PuTTY 打开后输入自己的Ip地址端口号默认是22 会跳出一个yes 跟no界面,点击yes 会进入一个类似cmd界面 直接输入root,然后会提示 ...

  6. Jupyter(Ipython) Notebook 入门

    upyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言. 一般用来编写漂亮的交互式文档. 文学编程的读者不是机器,而是人. 我们 ...

  7. lamlmzhang的新博客开通了,欢迎大家的关注

    从这里开始lamlmzhang的java开发之路~!

  8. eclipse中代码整体左右移动的方法

    1.向左:将要移动的代码选中,然后按TAB键2.向右:将要移动的代码选中,然后按shift+tab键 kettas:  2009-8-21

  9. (转)Hibernate的配置详解

    http://blog.csdn.net/yerenyuan_pku/article/details/65041077 在<Hibernate快速入门>一文中,我有讲到Hibernate的 ...

  10. (转)淘淘商城系列——初始SolrCloud

    http://blog.csdn.net/yerenyuan_pku/article/details/72944611 本文我只是简单介绍一下SolrCloud,如果大家要是感兴趣的话,可以参考Sol ...