一般来说, 调用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的摧毁和重建. 比如改变屏幕方向(见上例), 改变设备语言设定, 键盘弹出等.

最新文章

  1. .NET判断是否为AJAX提交
  2. CF732D. Exams[二分答案 贪心]
  3. 中国175个 AAAAA级风景区,去过20个 以上,你就是旅游达人
  4. CKPT进程工作机制
  5. sql 执行时间
  6. Haskell解决逆波兰式
  7. java获取常见文本文件的编码 解决乱码问题
  8. php curl破解防盗链
  9. Extjs4.2 多选下拉框
  10. BZOJ 1699: [Usaco2007 Jan]Balanced Lineup排队
  11. 【机器学习】代价函数(cost function)
  12. CSS背景效果
  13. java 类与类,类与接口 ,接口与接口关系
  14. CCNA
  15. 如何快速申请苹果IOS个人开发者账号
  16. U3D面试五
  17. SED单行脚本快速参考(Unix 流编辑器)(转)
  18. 《Essential C++》读书笔记 之 C++编程基础
  19. canvas学习之小球动画
  20. 左连接LEFT JOIN 连接自己时的查询结果测试

热门文章

  1. easyui form.rest和clear 重置表单和清除表单数据区别
  2. 【反射】Java反射机制
  3. [ SDOI 2009 ] HH的项链 & [ HEOI 2012 ] 采花
  4. Android项目实战_手机安全卫士系统加速
  5. 设计模式——“signleton”
  6. GridView中的日期处理
  7. Redis 之持久化(rdb、aof)
  8. mysql动态执行sql批量删除数据
  9. Lua中返回值的丢失问题
  10. 小程序map地图多点定位