Android Bundle-程序员宅基地

技术标签: java  移动开发  

#Bundle类介绍

Bundle主要用于传递数据;它保存的数据,是以key-value(键值对)的形式存在的。

我们经常使用Bundle在Activity之间传递数据,传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组,也可以是对象或对象数组。当Bundle传递的是对象或对象数组时,必须实现Serializable 或Parcelable接口。下面分别介绍Activity之间如何传递基本类型、传递对象。

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

#使用方法

使用Bundle在两个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);



//从Intent 中获取数据
Bundle myBundelForGetName=this.getIntent().getExtras();
String name=myBundelForGetName.getString("Key_Name");
myTextView_showName.setText("欢迎您进入:"+name);

 

#与Intent对比

两个Activity之间传递数据,数据的附加有两种方式:
一种是直接 intent.putxx();
另一种是  先bundle.putxx(), 然后再调用public Intent putExtras (Bundle extras)  添加bundle.

其实两种的本质是一样的。

Intent的方法:
[java] view plaincopy
public Intent putExtra(String name, boolean value); 
public Intent putExtra(String name, byte value); 
public Intent putExtra(String name, char value); 
public Intent putExtra(String name, short value); 
public Intent putExtra(String name, int value); 
public Intent putExtra(String name, long value); 
public Intent putExtra(String name, float value); 
public Intent putExtra(String name, double value); 
public Intent putExtra(String name, String value); 
public Intent putExtra(String name, CharSequence value); 
public Intent putExtra(String name, Parcelable value); 
public Intent putExtra(String name, Parcelable[] value); 
... 

intent内部定义了很多put方法,功能都是把key-value存进来。具体put函数的内部实现:
[java] view plaincopy
public Intent putExtra(String name, boolean value) { 
    if (mExtras == null) { 
        mExtras = new Bundle(); 
    } 
    mExtras.putBoolean(name, value); 
    return this; 

其中mExtras是intent内部定义的一个private Bundle变量。
可以看到,intent其实是调用了bundle相应的put函数,也就是说,intent内部还是用bundle来实现数据传递的,只是封装了一层而已。

再来说Bundle:
[java] view plaincopy
public void putBoolean(String key, boolean value); 
public void putByte(String key, byte value); 
public void putChar(String key, char value); 
 
... 
再来看用法:
只用intent:类型什么的是不需要你来操心的,你只需要putExtra就好了,内部会都存在一个bundle对象中。key-value对是一个一个被加进去的。
用intent和bundle:key-value对先被一个个的加到bundle里面,再把这个bundle put到intent中,其中用了下面这个函数:
[java] view plaincopy
public Intent putExtras(Bundle extras) { 
    if (mExtras == null) { 
        mExtras = new Bundle(); 
    } 
    mExtras.putAll(extras); 
    return this; 

可以看到,其实是把之前那个bundle中的数据批量添加到intent内部的bundle中。
取数据的时候,可以一个个的取出来(这个不赘述了),也可以把数据打包一起取出来:
[java] view plaincopy
public Bundle getExtras() { 
    return (mExtras != null) 
            ? new Bundle(mExtras) 
            : null; 

这个函数是把当前intent中所有的数据一起打包的(假如说你既用了bundle也用了intent本身的put函数来加数据,最后用get函数返回的是bundle+其他数据一起的)。

两者的区别是什么,如果你想对数据进行比较灵活的操作(批量操作什么的)的话就用bundle吧,当然你也可以getIntent()之后直接添加数据然后把这个intent发送出去。
还有就是,Bundle是可以对对象进行操作的,而Intent不可以。Bundle相对于Intent比较偏下层,比Intent接口更多,更灵活,但Bundle仍需要借助Intent才能在Activity之间传递。
概括一下,Intent旨在数据传递,bundle旨在存取数据,当然intent也提供一部分数据的存取,但比起bundle就显得不专业,不灵活的多

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34295316/article/details/86324608

智能推荐

2020-12-18_class gobang(game.game): def __init__(self, title,-程序员宅基地

Python创建英雄战机及其初始位置设置创建英雄战机的类Hero(GameSprite)class Hero(GameSprite): def __init__(self): # 01.调用父类方法设置游戏图像和速度 super().__init__("./素材/images/me1.png", 0) # 02.设置英雄战机的位置,置于游戏下方的正中间 # 设置英雄战机的水平居中位置 self.rect.center_class gobang(game.game): def __init__(self, title, size, fps=15): super(goba

史上最全一线互联网高频面试题1000道解析:JVM+分布式+MySQL+并发+Spring全家桶+Redis+中间件等-程序员宅基地

小伙四面美团终拿下Offer,全靠刷了这1000道互联网高频面试笔记我一铁哥们从去年到今年先后面试了 4次美团,外卖、订单、商旅面试了好几个部门,终于在今年年初成功拿下offer,总结下来各部门面试的大体思路基本都一致。比如:JVM 参数配置、常用调试工具、分区、类加载,还会问你有需要线上的调试问题吗?遇到死循环 CPU 飙升怎么解决? Java 并发包常用工具用法和原理、会配合集合类一起考,对了还会有 volatile、CAS 原理等。 MySQL 也算是必备了,索引存储结构、索引搜索原理..

贾谊_屈平行正-程序员宅基地

极坐标系与极坐标,二重积分转化为极坐标系下的计算_屈平行正

【异常处理】org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception_农民真快落的博客-程序员宅基地

org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.StackOverflowError在用ssm做【修改订单】功能时,用ajax发请求获取失败,报了栈溢出的异常。解决:原来是没有加@ResponseBody就直接返回了对象,应该加上去,表明不是跳转页面,是返回json...

sas ods excel输出多sheet,包含图片、目录等-程序员宅基地

ods excel可以输出多表格 多图片到一个sheet中,相比较于其他的工具更好用。但是很多人并不知道怎么输出到多个sheet中,以下给出一个搜索到的解决方案。转载请注明出处:https://www.cnblogs.com/SSSR/p/11105838.html有了此法就可以创建完整的excel报表了。先直接上代码:修改fbout的值即可运行,ods es..._ods excel 多个sheet

XCTF web Web_php_include (php://过滤)_php include php://-程序员宅基地

题目代码<?phpshow_source(__FILE__);echo $_GET['hello'];$page=$_GET['page'];while (strstr($page, "php://")) { $page=str_replace("php://", "", $page);}include($page);?>用php://来引入文件流,然后include显示文件信息php://被过滤,但是有个hello因为这个页面就是默认页面,而且默认页面也可以用i_php include php://

随便推点

python安装第三方module(zip包)-程序员宅基地

背景: Github上有很多第三方module,有时候我们项目里需要,但是使用pip去安装时发现找不到这个包,这里以sqlalchemy的一个dev版本为例1. 下载 (地址:https://github.com/sqlalchemy/sqlalchemy/archive/rel_1_3.zip)2. 解压zip包3. 进入项目虚拟环境,执行setup.py(venv)...

linux实验日常管理和维护,实验三linux系统管理-程序员宅基地

实验三实验三 linuxlinux 系统管理系统管理 实验目的实验目的 练习 Linux 系统管理 熟悉 Linux 系统管理 实验要求实验要求 通过 Liunx 用户和组管理 设备管理 文件系统管理 进程管理 和 shell 程序设计 能够掌握 linux 系统管理 完成系统日常维护和管理工作 最后上交实验报告 实验内容实验内容 1 用户和组管理 1 创建用户 gl 设置口令为 12345 2 ...

正则表达式整理-程序员宅基地

正则表达式非常有用,查找、匹配、处理字符串、替换和转换字符串,输入输出等。而且各种语言都支持,例如.NET正则库,JDK正则包, Perl, JavaScript等各种脚本语言都支持正则表达式。下面整理一些常用的正则表达式。字符描述\将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 ...

Shell变量基础与常用运算符-程序员宅基地

shell变量的命名规则:命名只能是字母、数字、下划线组成,首个字母不能以数字开头中间不能有空格,可以使用下划线不能使用标点符号,不能使用bash里面的关键字(可用help命令查看保留关键字)注意事项:1/若指定的变量名已存在,相当于为此变量重新赋值2.等号两边不要有空格3.变量名由字母/数字/下划线组成,区分大小写4.变量名不能以数字开头,不要使用关键字和特殊字符5....

Mysql 列转行统计查询 、行转列统计查询-- 转-程序员宅基地

-- ------------------------------ Table structure for `TabName`-- ----------------------------DROP TABLE IF EXISTS `TabName`;CREATE TABLE `TabName` ( `Id` int(11) NOT NULL..._mysql 递归查询 列转行

超强干货!TensorFlow易用代码大集合...-程序员宅基地

摘自机器之心实际上,在我们搭建自己的模型或系统时,复制并粘贴这些代码就行了。它们以规范的形式定义不同的功能模块,因此只要修改少量参数与代码,它们就能完美地融入到我们项目中...