《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的摧毁和重建。这个我们在本章上面节点“配置改变”中提到过,所以,如果你想要测试你的程序恢复状态的能力,简单的旋转装置,让屏幕横竖屏切换是非常好的方式。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
《Android 开发入门与实战(第二版)》——6.6节配置改变
本节书摘来自异步社区《Android 开发入门与实战(第二版)》一书中的第6章,第6.6节配置改变,作者eoe移动开发者社区 组编 , 姚尚朗 , 靳岩,更多章节内容可以访问云栖社区“异步社区”公众号查看 6.6 配置改变Android 开发入门与实战(第二版)如果设备的配置改变了(定义在Resource.Configuration类中),任何显示在界面上的东西都需要更新以适应配置。由于Activity是与用户交互的主要机制,所以它也包括一些处理配置改变的特殊支持。 除非你指定了,否则配置改变(比如改变屏幕方向,语言,输入设备等)会导致你当前的Activity会销毁,并调用相应的Activity生命周期进程函数onPause(),onStop()以及onDestroy()。如果这个Activity运行在前台或者对用户可见,一旦这个实例(Activity)的onDestroy()被调用后就会马上又创建一个新的该Activity实例,并且前一个Activity实例中的onSaveInstanceState(Bundle)方法中产生的savedInstanceState也还存在。 这样做是因...
- 下一篇
《Android 开发入门与实战(第二版)》——6.8节启动Activity并得到结果
本节书摘来自异步社区《Android 开发入门与实战(第二版)》一书中的第6章,第6.8节启动Activity并得到结果,作者eoe移动开发者社区 组编 , 姚尚朗 , 靳岩,更多章节内容可以访问云栖社区“异步社区”公众号查看 6.8 启动Activity并得到结果Android 开发入门与实战(第二版)在Activity中,你可以调用startActivity(Intent)方法被用来启动一个新的Activity,并将这个新的Activity置于Activity栈的最顶部。但是有时候,你却可能希望当一个Activity结束时从这个被结束的Activity中得到一个返回结果,例如,你可能启动了一个Activity让用户在联系人名单上选择一个人,当这个Activity结束时,它返回这个被选中的人给你。为了做到这个,你可以调用startActivityForResult(Intent,int),结果将会通过onActivityResult(int,int,Intent)方法返回。 当一个Activity退出时,它可以调用setResult(int)将数据返回到它的父类,当然,它也必须要提供...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- Hadoop3单机部署,实现最简伪集群
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题