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发散的更多相关文章

  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 笔记之 R 文件

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

  6. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  7. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  8. Mastering Web Application Development with AngularJS 读书笔记(二)

    第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...

  9. Python 学习笔记二

    笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...

  10. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

随机推荐

  1. [转] Linux下查看用户列表

    原文地址:http://xiaod.in/read.php?77 俺的centos vps上面不知道添加了多少个账户,今天想清理一下,但是以前还未查看过linux用户列表,google了一下,找到方便 ...

  2. Android(java)学习笔记257:JNI之helloword案例(利用NDK工具)

    1.逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们要 ...

  3. hdu 5108

    //题意是给一个数N,然后让你求M,使得N/M为素数,并且M的值最小 //思路呢,大概有两种,一个是遍历素数求解的,不过数据太大不现实 //另外一种就是质因数求解,for循环是遍历质因数,然后whil ...

  4. memcache缓存命中深入理解转载

    http://www.iteye.com/topic/225692 memcache的方法有 add,set,replace,get,delete,getstats,increment,decreme ...

  5. 执​行​o​r​a​c​l​e​函​数​的​四​种​方​法

    1.在定义函数时:如果有参数,则参数可有类型但是不加长度. 2.在执行函数: var/variable var_name var_type(如果数据类型是number则没有长度,如果数据类型是varc ...

  6. Struts2 手动验证

    * 首先要从页面中获取对应的标签name属性的值,在动作类action中声明同名的属性,提供get和set方法        * 要继承ActionSupport类或者实现Validateable接口 ...

  7. 你好,C++(23) 4.4.2 工资程序成长记:用数组处理批量数据,用循环结构执行重复动作

    4.4  从语句到程序 了解了各种表达式和语句之后,就相当于掌握了写作文要用到的词语和句子,但是,仅有词语和句子是无法构成一篇有意义的文章的.要完成一篇文章,先需要确定这篇文章的结构,是先分述再总述, ...

  8. C/C++安全编码-字符串

    1 字符串     1.1 字符串基础 字符串提供命令行参数.环境变量.控制台输入.文本文件及网络连 接,提供外部输入方法来影响程序的行为和输出,这也是程序容易出错的地方.字符串是一个概念,并不是C/ ...

  9. JavaScript escape() 函数

    JavaScript escape() 函数 JavaScript 全局对象 定义和用法 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法 escape(str ...

  10. phpCMS V9 自定义添加 全局变量{SKIN_PATH}方法

    前言:目前v9版本新增{js_path},{css_path},{img_path}三个全局变量,代替2008版本中{skin_path},样式图片脚本分开路径,确实达到了一定在后台管理方便的目的,但 ...