安卓进阶篇-Bundle


Android中Bundle类的作用

Bundle类用作携带数据,

根据google官方的文档(http://developer.android.com/reference/android/os/Bundle.html

Bundle类是一个key-value对,“A mapping from String values to various Parcelable types.”

,它类似于Map,用于存放key-value名值对形式的值。相对于Map,它提供了各种常用类型的putXxx()/getXxx()方法,如:putString()/getString()和putInt()/getInt(),putXxx()用于往Bundle对象放入数据,getXxx()方法用于从Bundle对象里获取数据。Bundle的内部实际上是使用了HashMap类型的变量来存放putXxx()方法放入的值:

public final class Bundle implements Parcelable, Cloneable {

......

Map mMap;

public Bundle() {

mMap = new HashMap();

......

}

public void putString(String key, String value) {

mMap.put(key, value);

}

public String getString(String key) {

Object o = mMap.get(key);

return (String) o;

........//类型转换失败后会返回null,这里省略了类型转换失败后的处理代码

}

}

类继承关系:

java.lang.Object

android.os.Bundle

Bundle类是一个final类:

public final class

Bundle

extends Objectimplements Parcelable Cloneable

在调用Bundle对象的getXxx()方法时,方法内部会从该变量中获取数据,然后对数据进行类型转换,转换成什么类型由方法的Xxx决定,getXxx()方法会把转换后的值返回。

一、API文档说明

  1.介绍

    用于不同Activity之间的数据传递

  1.重要方法

    clear():清除此Bundle映射中的所有保存的数据。

    clone():克隆当前Bundle

    containsKey(String key):返回指定key的值

    getString(String key):返回指定key的字符

    hasFileDescriptors():指示是否包含任何捆绑打包文件描述符

    isEmpty():如果这个捆绑映射为空,则返回true

    putString(String key, String value):插入一个给定key的字符串值

    readFromParcel(Parcel parcel):读取这个parcel的内容

    remove(String key):移除指定key的值

    writeToParcel(Parcel parcel, int flags):写入这个parcel的内容

两个activity之间的通讯可以通过bundle类来实现,做法就是:

1)新建一个bundle类

[java] view
plain
copy

  1. Bundle mBundle = new Bundle();

(2)bundle类中加入数据(key -value的形式,另一个activity里面取数据的时候,就要用到key,找出对应的value)

[java] view
plain
copy

  1. mBundle.putString("Data", "data from TestBundle");

(3)新建一个intent对象,并将该bundle加入这个intent对象

[cpp] view
plain
copy

  1. Intent intent = new Intent();
  2. intent.setClass(TestBundle.this, Target.class);
  3. intent.putExtras(mBundle);

代码实例:

例子1:

两个类如下:intent从TestBundle类发起,到Target类。

类1:TestBundle类

  1. Intent intent = new Intent();
  2. intent.setClass(TestBundle.this, Target.class);
  3. Bundle mBundle = new Bundle();
  4. mBundle.putString("Data", "data from TestBundle");//压入数据
  5. intent.putExtras(mBundle);
  6. startActivity(intent);

类2: Target

  1. Bundle bundle = getIntent().getExtras();  //得到传过来的bundle
  2. String data = bundle.getString("Data");//读出数据
  3. setTitle(data);

例子2:

使用Bundle在Activity间传递数据

从源Activity 中传递数据

//数据写入Intent

Intent openWelcomeActivityIntent=new Intent();

Bundle myBundelForName=new Bundle();

myBundelForName.putString("Key_Name",inName.getText().toString());

myBundelForName.putString("Key_Age",inAge.getText().toString());

openWelcomeActivityIntent.putExtras(myBundelForName);

openWelcomeActivityIntent.setClass(AndroidBundel.this, Welcome.class);

startActivity(openWelcomeActivityIntent);

目标Activity 中获取数据

//从Intent 中获取数据

Bundle myBundelForGetName=this.getIntent().getExtras();

String name=myBundelForGetName.getString("Key_Name");

myTextView_showName.setText("欢迎您进入:"+name);

使用Bundle在Activity间传递数据2

从源请求Activity 中通过一个Intent 把一个服务请求传到目标Activity 中

private Intent toNextIntent;//Intent 成员声明

toNextIntent=new Intent();//Intent 定义

toNextIntent.setClass(TwoActivityME3.this, SecondActivity3.class);

//设定开启的下一个Activity

startActivityForResult(toNextIntent, REQUEST_ASK);

//开启Intent 时候,把请求码同时传递

在源请求Activity 中等待Intent 返回应答结果,通过重载onActivityResult()方法

@Override

protected void onActivityResult(int requestCode,int resultCode, Intent data) {

// TODO Auto-generated method stub

super.onActivityResult(requestCode, resultCode, data);

if(requestCode==REQUEST_ASK){

if(resultCode==RESULT_CANCELED){

setTitle("Cancel****");

}else if(resultCode==RESULT_OK){

showBundle=data.getExtras();//从返回的Intent中获得Bundle

Name=showBundle.getString("myName");//从bundle中获得相应数据

text.setText("the name get from the second layout:\n"+Name);

}

}

}

? 第一个参数是你开启请求Intent时的对应请求码,可以自己定义。

? 第二个参数是目标Activity返回的验证结果码

? 第三个参数是目标Activity返回的Intent

目标Activity 中发送请求结果代码,连同源Activity 请求的数据一同绑定到Bundle

中通过Intent 传回源请求Activity 中

Log与DDMS(查看Log等信息)

@Override

protected void onActivityResult(int requestCode,

int resultCode, Intent data) {

// TODO Auto-generated method stub

super.onActivityResult(requestCode, resultCode, data);

if(requestCode==REQUEST_ASK){

if(resultCode==RESULT_CANCELED){

setTitle("Cancel****");

}else if(resultCode==RESULT_OK){

showBundle=data.getExtras();//从返回的Intent中获得Bundle

Name=showBundle.getString("myName");//从bundle中获得相应数据

text.setText("the name get from the second layout:\n"+Name);

}

}

}

目标Activity 中发送请求结果代码,连同源Activity 请求的数据一同绑定到Bundle

中通过Intent 传回源请求Activity 中

backIntent=new Intent();

stringBundle=new Bundle();

stringBundle.putString("myName", Name);

backIntent.putExtras(stringBundle);

setResult(RESULT_OK, backIntent);//返回Activity结果码

finish();

另外:与SharedPreferences的区别

  SharedPreferences是简单的存储持久化的设置,就像用户每次打开应用程序时的主页,它只是一些简单的键值对来操作。它将数据保存在一个xml文件中

  Bundle是将数据传递到另一个上下文中或保存或回复你自己状态的数据存储方式。它的数据不是持久化状态。

时间: 2024-10-24 03:22:49

安卓进阶篇-Bundle的相关文章

Maya基础与建模教程 AE教程进阶篇 3DS MAX影视特效教程 Flash CS4案例教程

热门推荐电脑办公计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程 Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程 更多>平面设计PhotoshopCS5教程 CorelDRAW X5视频教程 Photoshop商业修图教程 Illustrator CS6视频教程 更多>室内设计3Dsmax2012教程 效果图实例提高教程 室内设计实战教程 欧式效果图制作实例教程 AutoCAD2014室内设计 Aut

移动端https抓包那些事--进阶篇

上一次和大家介绍了手机端https抓包的初级篇,即在手机未root或者未越狱的情况下如何抓取https流量,但是当时分析应用时会发现,好多应用的https的流量还是无法抓取到,这是为什么呢? 主要原因还是客户端在实现https请求时对于证书的校验上,如果仅仅校验是否有证书但是未严格校验证书的有效性时,就可以通过手机客户端安装抓包工具的证书来绕过签名校验,但是如果客户端做了严格的证书校验,如果不是受信任证书则无法正常进行https通信,遇到这种情况我们该如何抓取https流量来进行业务分析呢? 接

Python之路【第十七篇】:Django【进阶篇 】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

在Horizon Workspace中配置Windows单点登录-进阶篇

在上一篇基础篇里面,简单介绍了在Horizon Workspace 1.8中如何配置Windows单点登录.在这篇博客中,会继续介绍一些针对大规模虚机或者虚拟桌面部署的配置方式.这些配置方式可以保证用模板部署出来的虚机或虚拟桌面在Workspace服务器端配置完成的情况下,不再需要用户进行手动配置就能实现HorizonWorkspace的单点登录. 1. 在模板机组策略中配置IE浏览器的设置 通过在模板虚拟机上的管理控制台中设置相应的策略,可以使后续使用模板机克隆出来的虚拟机自动使用Window

java web进阶篇(四) Tomcat数据源

动态web开发的最大特点是可以进行数据库的操作,传统的jdbc操作由于步骤重复性造成程序性能下降. 先来回顾JDBC的操作原理 1.加载数据库驱动程序,数据库驱动程序通过classpath配置. 2.通过DirverManager类取得数据库连接对象. 3.通过Connection实例化PreparedStatement对象,编写sql语句命令操作数据库. 4.数据库属于资源操作,操作完成后要关闭数据库以释放资源. 其实以上操作,1.2.4步骤是重复的,保留3,实际上就是数据源产生的原因. 数据

Python之路【第十七篇】:Django之【进阶篇】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

Python基础—面向对象(进阶篇)

通过上一篇博客我们已经对面向对象有所了解,下面我们先回顾一下上篇文章介绍的内容: 上篇博客地址:http://www.cnblogs.com/phennry/p/5606718.html 面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用: 类是一个模版,模板中包装了多个方法供使用(这里方法就是函数): 对象,根据模板创建的实例,实例用于调用被包装在类中的函数: 面向对象的三大特性:封装.继承.多态. 今天博客的内容主要介绍:Python类的成员.成员修饰符.类的特殊成员.异常处理和

ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL

http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html 引言-- 在初级篇中,我们介绍了如何利用基于ASP.NET MVC的Web程序中的Global文件来简单的重写路由.也介绍了它本身的局限性-依赖于路由信息中的键值对: 如果键值对中没有的值,我们无法将其利用凑出我们想要的URL表达式. 初级篇传送门:使用Global路由表定制URL   在进阶篇中,我们将介绍ASP.NET 路由相关类的基类-抽象类RouteBas

Visual Studio调试之断点进阶篇

Visual Studio调试之断点进阶篇 在上一篇文章Visual Studio调试之断点基础篇里面介绍了什么是断点,INT 是Intel系列CPU的一个指令,可以让程序产生一个中断或者异常.程序中如果有中断或者异常发生了以后,CPU会中断程序的执行,去一个叫做IDT的部件查找处理这个中断(或者异常)的例程(Handler).IDT是操作系统在启动的时候初始化的,至于IDT的细节问题,例如什么是IDT,怎样编写一个IDT的例程,怎样 初始化IDT,可以去网上搜索一些资料. 总之,这里我们只要知