Android笔记(二):savedIndstanceState 和 Bundle
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的更多相关文章
- Android笔记二十七.Service组件入门(一).什么是Service?
转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.Service 1.Service简单介绍 Service为Android四大组件之中 ...
- Android笔记二十四.Android基于回调的事件处理机制
假设说事件监听机制是一种托付式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器全然消失了,当用户在GUI控件上激发某个事件时,控 ...
- Android笔记——Android中数据的存储方式(二)
我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效 ...
- Android笔记--View绘制流程源码分析(二)
Android笔记--View绘制流程源码分析二 通过上一篇View绘制流程源码分析一可以知晓整个绘制流程之前,在activity启动过程中: Window的建立(activit.attach生成), ...
- Android笔记(二十) Activity中的跳转和值传递
我们知道,一个APP是由若干个Activity组成的,那么各个Acitivity中肯定需要进行跳转以及传递数值以保证App的运行,现总结一下多个Activity之间的跳转和值传递. 显式Intent跳 ...
- Android笔记:触摸事件的分析与总结----TouchEvent处理机制
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320 ...
- Android进阶(二十八)上下文菜单ContextMenu使用案例
上下文菜单ContextMenu使用案例 前言 回顾之前的应用程序,发现之前创建的选项菜单无法显示了.按照正常逻辑来说,左图中在"商品信息"一栏中应该存在选项菜单,用户可进行分享等 ...
- Android 利用二次贝塞尔曲线模仿购物车加入物品抛物线动画
Android 利用二次贝塞尔曲线模仿购物车加入物品抛物线动画 0.首先.先给出一张效果gif图. 1.贝塞尔曲线原理及相关公式參考:http://www.jianshu.com/p/c0d7ad79 ...
- webpack笔记二 管理资源
webpack笔记二 管理资源 webpack最出色的功能之一就是除了引入JavaScript,还可以通过loader引入任何其它类型的文件. 加载CSS 为了在JavaScript模块中import ...
- Android 笔记之 R 文件
Android笔记之R文件 h2{ color: #4abcde; } a{ color: blue; text-decoration: none; } a:hover{ color: red; te ...
随机推荐
- Kafka 温故(二):Kafka的基本概念和结构
一.Kafka中的核心概念 Producer: 特指消息的生产者Consumer :特指消息的消费者Consumer Group :消费者组,可以并行消费Topic中partition的消息Broke ...
- ASP.NET MVC学习笔记-----Filter(1)
Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter AuthorizeAttribute 最先执行,在其他类型的fi ...
- [转载]HTML5 真的会消灭原生App吗?
http://mp.weixin.qq.com/s?__biz=MzA5NjQ4MzkyMw==&mid=201728945&idx=1&sn=8f43b5bb10695efc ...
- [转]CSS浏览器兼容问题总结
E6.0,ie7.0与Firefox的CSS兼容性问题1.DOCTYPE 影响 CSS 处理 2.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, ...
- Flex 经验笔记一
Module页面嵌套子Module页面直接用标签嵌入是不行的,无法显示出来,需要用到 ModuleManager 使用ModuleInfo 的 addEventListener 判断当子Module ...
- expect 交互 之shell执行命令操作
shell 执行命令操作 /usr/bin/expect -c " proc jiaohu {} { send_user expect_start expect { password { s ...
- E1. Array and Segments (Easy version)(暴力) && E2. Array and Segments (Hard version)(线段树维护)
题目链接: E1:http://codeforces.com/contest/1108/problem/E1 E2:http://codeforces.com/contest/1108/problem ...
- ViewGroup.layout(int l, int t, int r, int b)四个输入参数的含义
ViewGroup.layout(int l, int t, int r, int b)这个方法是确定View的大小和位置的,然后将其绘制出来,里面的四个参数分别是View的四个点的坐标,他的坐标不是 ...
- 洛谷 P4609: [FJOI2016] 建筑师
本省省选题是需要做的. 题目传送门:洛谷P4609. 题意简述: 求有多少个 \(1\) 到 \(N\) 的排列,满足比之前的所有数都大的数正好有 \(A\) 个,比之后的所有数都大的数正好有 \(B ...
- Mini Twitter
Implement a simple twitter. Support the following method: postTweet(user_id, tweet_text). Post a twe ...