savedIndstanceState

savedIndstanceState 位于 Activity onCreate(Bundle savedInstanceState)方法的参数中。对这个参数的理解要结合 Activity的生命周期

方法 说明
onCreate() 加载布局
onStart() 可见
onResume() 可交互
onPause() 不可交互,部分不可见
onStop() 完全不可见
onDestroy 活动被销毁

一个活动在 onCreate 加载布局文件,而在活动进入 onPause 和 onStop 的时候,可能会由于更高优先级的应用需要内存而被系统回收。一旦被回收,下次再进入这个活动,就必须从 onCreate 开始执行,这也就代表着布局重新加载。那么,很自然地,原来跟布局有关的变量值会被重置。例如在 EditText 里输入的内容会被清空。不过如果你有给这些 View 设置id ,onSaveInstanceState() 会 自动帮你保存 需要恢复的数据。

如何恢复 View 之外的数据? Activity 提供了两个东西来配合:

  • 在活动变为不可见之后,系统会自动调用 onSaveInstanceState(Bundle outState) 方法(按 Back 键退出除外)。可以重写该方法并将需要保存的数据传入 outState 中。

  • 在活动重建时,也就是执行 onCreate(Bundle savedInstanceState) 时,可以从参数里取出数据,再将这些数据还原回去。注意,需要在 onCreate 里加入if (savedInstanceState != null)的判断,否则若是第一次进入这个活动,会因为 savedInstanceState 为 null 而出现异常。

    在 onStart() 和 onPostCreate(Bundle) 之间,会执行 onRestoreInstanceState(Bundle savedInstanceState) 。也可以在这里恢复数据。

    注: onPostCreate(Bundle) 之后是 onResume()

那么这里的Bundle是什么?

它的英文释义是:

a package of several things tied together for carrying or storing.

翻译过来就是:为了搬运或者存储而将几件东西捆在一起的包裹。

它是一个 Map ,有 key 和 value ,即键值对,例如:水果名:西瓜

这个 Bundle 和普通的 Map 不一样,普通的 Map 要求 key 和 value 的类型一旦由你指定,就不能有其他种类型。而 Bundle 的 key 和 value 的类型不是你来指定的,它的 key 只能是 String 类型,而 value 可以是 String ,也可以是 int 等内置类型。你可以从这:Bundle官方文档 往下看它支持的数据。

同一个 key 只能对应一个 value 。当 key 相同而 value 的类型不同时,后面添加的 键值对 会将原来的清除掉。

Bundle 是类型安全(typesafe)的,这体现在你想获取一个存储在 Bundle 里的 String ,只能用 getStringExtra(String key) ,如果用 getInt(String key) ,即使传入正确的 key 也得不到该 String ,而是一个默认的0。并且你会在 Log 里看到:

Key myString expected Integer but value was a java.lang.String.  The default value 0 was returned.

Bundle还能用在哪里?

使用 Intent 的时候,有一个putExtra(String name, Bundle value),详见 Intent官方文档

你可以在列表中看到一个 putParcelable(String key, Parcelable value) 。如果你希望将自己创建的一个类从一个 Activity 传送到另一个 Activity ,可以令这个类实现 Parcelable ,接着放到 Bundle 里传输。不过也可以直接将 Parcelable 放在 Intent 里面。

那么要直接放 Intent 还是放在 Bundle 更好呢?有待探索……

Parcelable 和 Serializable 的区别?

实现 Parcelable 需要自己去实现方法,其中:

  • 通过writeToParcel(Parcel out, int flags)将类的变量值存储到 out 里面。
  • 通过createFromParcel(Parcel source)从 source 里取出数据,赋值给类,并 return 出去。

而实现 Serializable 不需要实现任何方法,系统帮你序列化。可以设置 serialVersionUID 字段:static final long serialVersionUID = 1L;

两者分别在什么时候使用?

在 Android 组件间传送数据的时候 Parcelable 的效率比 Serializable 高很多,此时使用 Parcelable 。在将存储到磁盘或者网络传输时,使用 Serializable ,不要使用 Parcelable 。

Android笔记(二):savedIndstanceState 和 Bundle的更多相关文章

  1. Android笔记二十七.Service组件入门(一).什么是Service?

    转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.Service 1.Service简单介绍     Service为Android四大组件之中 ...

  2. Android笔记二十四.Android基于回调的事件处理机制

        假设说事件监听机制是一种托付式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器全然消失了,当用户在GUI控件上激发某个事件时,控 ...

  3. Android笔记——Android中数据的存储方式(二)

    我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效 ...

  4. Android笔记--View绘制流程源码分析(二)

    Android笔记--View绘制流程源码分析二 通过上一篇View绘制流程源码分析一可以知晓整个绘制流程之前,在activity启动过程中: Window的建立(activit.attach生成), ...

  5. Android笔记(二十) Activity中的跳转和值传递

    我们知道,一个APP是由若干个Activity组成的,那么各个Acitivity中肯定需要进行跳转以及传递数值以保证App的运行,现总结一下多个Activity之间的跳转和值传递. 显式Intent跳 ...

  6. Android笔记:触摸事件的分析与总结----TouchEvent处理机制

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320   ...

  7. Android进阶(二十八)上下文菜单ContextMenu使用案例

    上下文菜单ContextMenu使用案例 前言 回顾之前的应用程序,发现之前创建的选项菜单无法显示了.按照正常逻辑来说,左图中在"商品信息"一栏中应该存在选项菜单,用户可进行分享等 ...

  8. Android 利用二次贝塞尔曲线模仿购物车加入物品抛物线动画

    Android 利用二次贝塞尔曲线模仿购物车加入物品抛物线动画 0.首先.先给出一张效果gif图. 1.贝塞尔曲线原理及相关公式參考:http://www.jianshu.com/p/c0d7ad79 ...

  9. webpack笔记二 管理资源

    webpack笔记二 管理资源 webpack最出色的功能之一就是除了引入JavaScript,还可以通过loader引入任何其它类型的文件. 加载CSS 为了在JavaScript模块中import ...

  10. Android 笔记之 R 文件

    Android笔记之R文件 h2{ color: #4abcde; } a{ color: blue; text-decoration: none; } a:hover{ color: red; te ...

随机推荐

  1. Spring Cloud (十五)Stream 入门、主要概念与自定义消息发送与接收

    前言 不写随笔的日子仿佛就是什么都没有产出一般--上节说到要学Spring Cloud Bus,这里发现按照官方文档的顺序反而会更好些,因为不必去后边的章节去为当前章节去打基础,所以我们先学习Spri ...

  2. 移动端手势库hammerJS 2.0.4官方文档翻译(转)

    hammerJS是一个优秀的.轻量级的触屏设备手势库,现在已经更新到2.04版本,跟1.0版本有点天壤地别了,毕竟改写了事件名并新增了许多方法,允许同时监听多个手势.自定义识别器,也可以识别滑动方向. ...

  3. [整理]zepto的初次使用

    http://www.css88.com/doc/zeptojs_api/ http://chaoskeh.com/blog/some-experience-of-using-zepto.html

  4. HTML5 JavaScript实现图片文字识别与提取

    8月底的时候,@阿里巴巴 推出了一款名为“拯救斯诺克”的闯关游戏,作为前端校园招聘的热身,做的相当不错,让我非常喜欢.后来又传出了一条消息,阿里推出了A-star(阿里星)计划,入职阿里的技术培训生, ...

  5. svn使用笔记

    一.checkout:第一次下载trunk里面的代码到本地 二.commit:提交一些修改* out of date : 本地版本号 < 服务器版本号* 如果过期,就update,可能会出现co ...

  6. CTEX windedt 打开中文tex乱码问题

    % !TEX encoding = System % !TEX program = pdflatex % !TEX encoding = System% !TEX program = pdflatex ...

  7. sort命令的k选项大讨论【转】

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  8. android 调用系统照相机拍照后保存到系统相册,在系统图库中能看到

    需求:  调用系统照相机进行拍照,并且保存到系统相册,调用系统相册的时候能看到   系统相册的路径:String cameraPath= Environment.getExternalStorageD ...

  9. IIS7配置HTTPS+默认访问https路径

    一.下载证书(这里我使用的是阿里云免费的证书) 文件说明: 1. 1532858285913.key(证书私钥文件).1532858285913.pem(证书文件).1532858285913.pfx ...

  10. spfa学习笔记

    序 spfa它死了 --by 大佬 但是本蒟蒻还是一如既往的使用spfa... 因为太弱了,其他什么都不会.于是就疯狂开O2跪倒在spfa上. 例题--汽车加油行驶问题 loj跳转链接 luogu跳转 ...