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. .NET面试题系列(九)C# 结构体与类的区别

    谈一下什么时候使用结构,什么使用类. 我们知道,结构存储在栈中,而栈有1个特点,就是空间较小,但是访问速度较快,堆空间较大,但是访问速度相对较慢.所以当我们描述1个轻量级对象的时候,可以将其定义为结构 ...

  2. CSS规范 - 分类方法--(来自网易)

    CSS文件的分类和引用顺序 通常,一个项目我们只引用一个CSS,但是对于较大的项目,我们需要把CSS文件进行分类. 我们按照CSS的性质和用途,将CSS文件分成“公共型样式”.“特殊型样式”.“皮肤型 ...

  3. java concurrent 中ExecutorService和CompletionService简单区别

    举个例子,现在需要执行10个任务,这些任务都是有返回值,并且需要使用10个线程同时执行.一般的做法就是创建ExecutorService线程池,pool大小10,每个任务实现Callable接口,然后 ...

  4. Miller_Rabin 素数测试

    费马定理的逆定理几乎可以用来判断一个数是否为素数,但是有一些数是判断不出来的,因此,Miller_Rabin测试方法对费马的测试过程做了改进,克服其存在的问题. 推理过程如下(摘自维基百科): 摘自另 ...

  5. python的__get__、__set__、__delete__(1)

    内容:    描述符引导        摘要        定义和介绍        描述符协议        调用描述符        样例        Properties        函数和 ...

  6. 使用 scm-manager 搭建 git/svn 代码管理仓库(二)

    主要介绍scm的配置. 1.配置为在Windows服务中启动scm-manager的启动方式有多种,可以在DOS(即命令行CMD模式)中启动,也可以在Windows服务中启动. 下面我们采用Windo ...

  7. Javascript - LayUI库的流加载

    LayUI库的流加载 用的LayUI-v2.2.45,将整个包解压缩后添加到项目,引入两个文件即可,不需要引入Jquery,此库自带: <link href="../js/layui- ...

  8. 2017/05/20 java 基础 随笔

    static 关键字的特点 1.随着类的加载而加载 2.优先于对象存在 3.被类的所有对象共享 如果某个成员变量是被所有对象共享的,那么他就应该定义为静态的 4.可以通过类名调用 其实它本身也可以通过 ...

  9. linux下热插拔事件的产生是怎样通知到用户空间,kobject_uevent_env之uevent【转】

    转自:http://blog.csdn.net/myarrow/article/details/8259888 1.kobject, ktype, kset 1) kobject: 代表sysfs中的 ...

  10. start-stop-daemon 启动停止系统守护进程

    1.start-stop-daemon start-stop-daemon是一个Debian体系里的一个守护进程管理软件,可以用指定的用户启停软件.CentOS有自己的daemon()机制(在/etc ...