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. java7,java8 中HashMap和ConcurrentHashMap简介

    一:Java7 中的HashMap 结构: HashMap 里面是一个数组,然后数组中每个元素是一个单向链表.链表中每个元素称为一个Entry 实例,Entry 包含四个属性:key, value, ...

  2. Docker学习笔记四 Docker容器

    本文地址:https://www.cnblogs.com/veinyin/p/10439849.html    容器是独立运行的一个或一组应用及他们的运行态环境,对应虚拟机的操作系统和应用. 启动 可 ...

  3. 玩转Hook——Android权限管理功能探讨(一)

    随着Android设备上的隐私安全问题越来越被公众重视,恶意软件对用户隐私,尤其是对电话.短信等私密信息的威胁日益突出,各大主流安全软件均推出了自己的隐私行为监控功能,在root情况下能有效防止恶意软 ...

  4. HDU 4472 Count DP题

    解题报告:题目大意,给你n个球,要将这n个球从下到上按层次排列,要求同一个层次的的每一个分支的数量都必须相等,问有多少种排列的方法. 此题的一个DP题,假设现在有n个球,要将这n个球排列好,我们就必须 ...

  5. mysql集成部署

    经常听说mysql数据库是集成在系统中,也一直不太明白集成的概念.今天才明白集成的概念就是将mysql所有的文件放到一个文件夹下放到系统中,也就是将mysql采用目录迁移部署的方式进行安装.在上一篇研 ...

  6. 运动规划——PT and PVT 模式

    最近项目成员在做机器人上层开发时,经常说到PT模式和PVT模式.一直没搞懂这两种模式的实际差别.上网检索进行学习...... ref link:https://blog.csdn.net/m0_376 ...

  7. (转)javascript方法--bind()

    地址:https://www.cnblogs.com/xxxxBW/p/4914567.html bind方法,顾名思义,就是绑定的意思,到底是怎么绑定然后怎么用呢,下面就来说说我对这个方法的理解. ...

  8. list 转换成dictionary,并统计词频

    >>> from collections import Counter>>> Counter(['apple','red','apple','red','red', ...

  9. H5页面调用手机打电话功能

    <head>里面加上: <meta name="format-detection" content="telephone=yes"/> ...

  10. mongodb分页查询

    Limit与Skip方法 MongoDB Limit() 方法 如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指 ...