开发者社区> 异步社区> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

《Android 开发入门与实战(第二版)》——6.7节如何保存和恢复Activity状态

简介:
+关注继续查看

本节书摘来自异步社区《Android 开发入门与实战(第二版)》一书中的第6章,第6.7节如何保存和恢复Activity状态,作者eoe移动开发者社区 组编 , 姚尚朗 , 靳岩,更多章节内容可以访问云栖社区“异步社区”公众号查看

6.7 如何保存和恢复Activity状态
Android 开发入门与实战(第二版)
之前我们提到了Activity的生命周期,也稍微了解了onPause和onStop方法,在调用了这两个方法后,Activity暂停或者停止(界面可能直接被覆盖了),但是这个Activity的实例仍然存在于内存中,并且它的信息和状态数据都不会销毁,当Activity重新回到前台后,所有的这些信息和状态又会回到和以前一样。

但是,如果系统在内存不足的情况下调用了onPause或onStop方法,Activity可能会被系统销毁,这个时候,内存中是不会存在Activity实例的,如果该Activity再次回到前台,之前的信息和状态可能无法保存,页面也就无法根据这些信息和状态回到原来的样子。为了避免这种情况,Activity中提供了onSaveInstanceState方法,这个方法接收一个Bundle类型参数,我们可以将状态和数据保存到Bundle对象中,这样的话,就算Activity被系统销毁,只要用户重新启动Activity调用onCreate方法,我们就能在onCreate方法中得到Bundle对象,并根据这个对象中的数据将Activity恢复到之前的样子。

具体可以看以下代码。

@Override 
  protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    savedInstanceState.get("preState");
  }

  @Override
  protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);
    outState.putString("preState", "eoe");
  }
第X问1 代码解释

我们在onSaveInstanceState方法中将eoe这个值以键为preState存入了outState这个Bundle对象,之后我们就能在onCreate方法中,通过savedInstanceState这个Bundle对象取得eoe这个值了。

注意

onSaveInstanceState方法并不一定会被调用,因为有些场景是不需要保存状态数据的,比如,当用户单击“后退”按钮的时候,因为用户已经明确要关闭当前Activity了。
其实,即使不覆写onSaveInstanceState方法,该方法依然会默认保存Activity的某些状态数据,比如Activity里各个UI控件的状态。Android里几乎所有的UI控件都适当地实现了onSaveInstanceState方法,所以,当Activity被摧毁并重新恢复时,这些控件会自动保存和恢复状态。比如EditText控件会自动保存和恢复输入的数据,checkbox也会保存它是否已经选中的状态,当然,要做到这点你也需要给这些控件指定ID,不然这个控件是不会自动进行数据和状态的保存与恢复的。

由于onSaveInstanceState方法不一定会被调用,所以,我们不适合在这个方法中保存持久化数据,例如向数据库中插入记录等,类似这种操作,应该放到onPause方法中进行(前面提过)。onSaveInstanceState方法其实只适合保存瞬时状态数据,比如某些成员变量等。

小知识

除了系统因为内存不足,会摧毁你处于暂停或停止状态的Activity之外,系统设置的改变也会导致Activity的摧毁和重建。这个我们在本章上面节点“配置改变”中提到过,所以,如果你想要测试你的程序恢复状态的能力,简单的旋转装置,让屏幕横竖屏切换是非常好的方式。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Kotlin学历之Android MVP架构实战
Kotlin学历之Android MVP架构实战
0 0
Android Backup功能之全面实战(2)
Android Backup功能之全面实战(2)
0 0
Android Backup功能之全面实战(1)
Android Backup功能之全面实战(1)
0 0
Android自定义控件(十)——SurfaceView实战实现天气APP背景移动效果
Android自定义控件(十)——SurfaceView实战实现天气APP背景移动效果
0 0
实战Android Wifi P2p
实战Android Wifi P2p
0 0
Android实战 | 详解MVC、MVP模式并分别实现登录界面案例
Android实战 | 详解MVC、MVP模式并分别实现登录界面案例
0 0
Android卡顿优化 | ANR分析与实战(附ANR-WatchDog源码分析及实战、与AndroidPerformanceMonitor的区别)
Android卡顿优化 | ANR分析与实战(附ANR-WatchDog源码分析及实战、与AndroidPerformanceMonitor的区别)
0 0
Android | App内存优化 之 内存泄漏 要点概述 以及 解决实战
Android | App内存优化 之 内存泄漏 要点概述 以及 解决实战
0 0
Android | App内存优化 之 内存抖动解决实战
Android | App内存优化 之 内存抖动解决实战
0 0
Android | TCP的C(Java|Android)/S(Java)通信实战经典聊天室案例(文末附本案例代码实现概述、观察者模式实现小结)
Android | TCP的C(Java|Android)/S(Java)通信实战经典聊天室案例(文末附本案例代码实现概述、观察者模式实现小结)
0 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Android组件化实现
立即下载
蚂蚁聚宝Android秒级编译—— Freeline
立即下载
Android插件化:从入门到放弃
立即下载