在activity(或者是fragement)被杀掉之前调用保存每个实例的状态,以保证该状态可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle)
(传入的Bundle参数是由onSaveInstanceState封装好的)中恢复。这个方法在一个activity被杀死前调用,当该activity在将来某个时刻回来时,可以恢复其先前状态。例如,如果activity B启用后位于activity A的前端,在某个时刻activity A因为系统回收资源的问题要被杀掉,A通过onSaveInstanceState将有机会保存其用户界面状态,使得将来用户返回到activity A时能通过onCreate(Bundle)或者onRestoreInstanceState(Bundle)恢复界面的状态。

不要将这个方法和activity生命周期回调如onPause()或onStop()搞混淆了,onPause()在activtiy被放置到背景或者自行销毁时总会被调用,onStop()在activity被销毁时被调用。一个会调用onPause()和onStop(),但不触发onSaveInstanceState的例子是当用户从activity
B返回到activity A时:没有必要调用B的onSaveInstanceState(Bundle),此时的B实例永远不会被恢复,因此系统会避免调用它。一个调用onPause()但不调用onSaveInstanceState的例子是当activity B启动并处在activity A的前端:如果在B的整个生命周期里A的用户界面状态都没有被破坏的话,系统是不会调用activity A的onSaveInstanceState(Bundle)的。

默认的实现负责了大部分UI实例状态的保存,采用的方式是调用UI层上每个拥有id的view的onSaveInstanceState()
,并且保存当前获得焦点的view的id(所有保存的状态信息都会在默认的onRestoreInstanceState(Bundle)实现中恢复。如果你覆写这个方法来保存额外的没有被各个view保存的信息,你可能想要在默认实现过程中调用或者自己保存每个视图的所有状态。如果被调用,这个方法会在onStop()前被触发,但系统并不保证是否在onPause()之前或者之后触发。

以上是API文档中的解释,我们在项目中一般在onSaveInstanceState()方法中保存数据,然后再onCreate()或者是onRestoreInstanceState(Bundle)中对界面进行恢复。

一个项目中的使用情景是,在onSaveInstanceState()中记录当前的可见的第一条listview的item的position信息,然后在onRestoreInstanceState(Bundle)中对listview调用setSelection()方法对位置进行定位,这样对用户体验更加友好

代码如下:

  1. @Override
  2. public void onSaveInstanceState(Bundle outState) {
  3. super.onSaveInstanceState(outState);
  4. //这是用SharedPreference实现的一个类,用于对目前的数据进行存储,在调用之前,先把里面的数据清空
  5. stateSaver.remove(this.toString());
  6. // 记录可见的第一条记录
  7. int firstVisiblePosition = listview.getFirstVisiblePosition();
  8. if (mInfoAdapter.getList().size() > 0) {
  9. //将现在的数据存储在SharedPreference中,便于恢复
  10. stateSaver.put(this.toString(), mInfoAdapter.getList());
  11. //将位置信息保存在Bundle对象中
  12. outState.putInt("firstVisiblePosition", firstVisiblePosition);
  13. }
  14. }

在onViewStateRestored()方法中进行数据的恢复

  1. @Override
  2. public void onViewStateRestored(Bundle savedInstanceState) {
  3. super.onViewStateRestored(savedInstanceState);
  4. //初始化显示位置
  5. int firstVisiblePosition = 0;
  6. //获得保存的位置信息
  7. if (savedInstanceState != null) {
  8. firstVisiblePosition = savedInstanceState.getInt("firstVisiblePosition");
  9. }
  10. if (stateSaver.get(this.toString()) != null) {
  11. List<EngineeringInfo> list = stateSaver.get(this.toString());
  12. if (list.size() > 0) {
  13. mInfoAdapter.setList(list);
  14. //恢复到上次看到的位置
  15. listview.setSelection(firstVisiblePosition);
  16. }
  17. }
  18. }

如有疑问,请留言

【Android进阶】Activity和Fragement中onSaveInstanceState()的使用详解的更多相关文章

  1. Android APP 读取 AndroidManifest.xml 中的版本信息详解

    APP都会涉及到版本的问题,Android APP的版本信息保存在AndroidManifest.xml文件的顶部.如下图: 有2个属性表示,“android:versionCode”和“androi ...

  2. Android中Service的使用详解和注意点(LocalService)

    Android中Service的使用详解和注意点(LocalService) 原文地址 开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalServ ...

  3. Android中SurfaceView的使用详解

    Android中SurfaceView的使用详解 http://blog.csdn.net/listening_music/article/details/6860786 Android NDK开发 ...

  4. Android中的windowSoftInputMode属性详解

    这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下     在前面的一篇文章中 ...

  5. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  6. Android中Application类的详解:

    Android中Application类的详解: 我们在平时的开发中,有时候可能会须要一些全局数据.来让应用中的全部Activity和View都能訪问到.大家在遇到这样的情况时,可能首先会想到自定义一 ...

  7. Android 高级UI设计笔记07:RecyclerView 的详解

    1. 使用RecyclerView       在 Android 应用程序中列表是一个非常重要的控件,适用场合非常多,如新闻列表.应用列表.消息列表等等,但是从Android 一出生到现在并没有非常 ...

  8. 转: Android 软件开发之如何使用Eclipse Debug调试程序详解(七)

    转自: http://www.uml.org.cn/mobiledev/201110092.asp Android 软件开发之如何使用Eclipse Debug调试程序详解(七)   发布于2011- ...

  9. gvoory脚本中关于HttpClient使用详解实例

    一.gvoory脚本中关于HttpClient使用详解实例 HttpClient:是一个接口 首先需要先创建一个DefaultHttpClient的实例 HttpClient httpClient=n ...

随机推荐

  1. OC -- 第一个类

    OC -- 第一个类 类名:Car 属性:轮胎个数.时速 行为:跑 完整写一个类:类的声明和实现 1.    类的声明 代码: // NSObject 再Foundation框架中 #import & ...

  2. Application to find the maximum temperature in the weather dataset

    import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop. ...

  3. c4Droid

    c4可以让用c/c++写的源码打包成apk安装包,支持Console.SDL.Qt. NativeActivity 等一系列扩展库,可以用来写软件,也可以用来写游戏,是手机端练习c/c++的神器.c4 ...

  4. PPPOE 模拟环境搭建

    这段时间.包含我自己測试OTT盒子 PPPOE的时候比較痛苦.要不就是在别人的位置上測试.要不就是借用PPPOE的设备,认为还是自己搭建一个PPPOE真实拨号上网的环境多好! 可是坑爹的win7找不到 ...

  5. 网络安全审查制度即将推出 手机App安全加密成必定趋势

    年05月22日宣布,为维护国家网络安全.保障中国用户合法利益,中国即将推出网络安全审查制度,关系国家安全和公共利益的系统使用的.重要信息技术产品和服务,应通过网络安全审查.文章出处:*** 网络安全审 ...

  6. SE 2014年5月9日

    两企业接入到 Internet(A公司和B公司),企业内部的用户及服务器均能够访问到 Internet. 2. A公司规模较大,采用了接入层/汇聚层/核心层的划分模式,接入层划分了多vLan(如图), ...

  7. 双向绑定 TwoWay MVVM

    1前台代码 <Grid> <StackPanel > <Grid x:Name="gridOne"> <Grid.Resources> ...

  8. 从零開始学android&lt;ImageSwitcher图片切换组件.二十六.&gt;

    ImageSwitcher组件的主要功能是完毕图片的切换显示,比如用户在进行图片浏览的时候.能够通过button点击一张张的切换显示的图片,并且使用ImageSwitcher组件在每次切换的时候也能够 ...

  9. 网站可以免费做业务CMS讨论

    中国现在用PHPCMS   DEDECMS织梦    科学新闻CMS  帝国.Discuz.Ecshop等待,但他们个人利益免费,业务.政府.授权费. 什么CMS它可以自由地做商务网站? 考虑到下面几 ...

  10. Robotium原则的实施源代码分析

    从前面的章节<Robotium源代码分析之Instrumentation进阶>中我们了解到了Robotium所基于的Instrumentation的一些进阶基础.比方它注入事件的原理等,但 ...