在Android中通过Intent使用Bundle传递对象
被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable
Java中使用的是Serializable,而谷歌在Android使用了自定义的Parcelable。
两种序列化方式的区别:
1.在使用内存的时候,Parcelable比Serializable性能高,推荐使用Parcelable类;
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC;
3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下,这种情况建议使用Serializable。
第一步:定义序列化实体类;
Serializable方式:
- /**
- * PersonSer
- *
- * @author http://blog.csdn.net/zuolongsnail
- */
- public class PersonSer implements Serializable {
- /**
- * serialVersionUID的作用是在修改实体类后,可以正常的序列化和反序列化,在此不多说,大家可以谷歌百度下。
- */
- private static final long serialVersionUID = -7620435178023928252L;
- private String name;
- private int age;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- }
Parcelable方式:
- /**
- * PersonPar
- *
- * @author http://blog.csdn.net/zuolongsnail
- */
- public class PersonPar implements Parcelable {
- private String name;
- private int age;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- /**
- * 序列化实体类
- */
- public static final Parcelable.Creator<PersonPar> CREATOR = new Creator<PersonPar>() {
- public PersonPar createFromParcel(Parcel source) {
- PersonPar personPar = new PersonPar();
- personPar.name = source.readString();
- personPar.age = source.readInt();
- return personPar;
- }
- public PersonPar[] newArray(int size) {
- return new PersonPar[size];
- }
- };
- @Override
- public int describeContents() {
- return 0;
- }
- /**
- * 将实体类数据写入Parcel
- */
- @Override
- public void writeToParcel(Parcel parcel, int flags) {
- parcel.writeString(name);
- parcel.writeInt(age);
- }
- }
第二步:传递序列化对象;
- Intent intent = new Intent(MainActivity.this, DestActivity.class);
- Bundle bundle = new Bundle();
- switch (v.getId()) {
- case R.id.serializable_btn:
- // Serializable传递对象
- PersonSer personSer = new PersonSer();
- personSer.setName("zuolong");
- personSer.setAge(26);
- bundle.putSerializable(SER_KEY, personSer);
- intent.putExtra("type", SER_TYPE);
- intent.putExtras(bundle);
- startActivity(intent);
- break;
- case R.id.parcelable_btn:
- // Parcelable传递对象
- PersonPar personPar = new PersonPar();
- personPar.setName("snail");
- personPar.setAge(27);
- // Bundle有putParcelableArray和putParcelableArrayList方法,也就可以传递数组和列表
- bundle.putParcelable(PAR_KEY, personPar);
- intent.putExtra("type", PAR_TYPE);
- // Intent也有putParcelableArrayListExtra方法,可以传递实现Parcelable接口的对象列表
- intent.putExtras(bundle);
- startActivity(intent);
- break;
- }
第三步:获取对象;
- StringBuffer sb = new StringBuffer();
- String type = getIntent().getStringExtra("type");
- // 根据type判断是哪种类型
- if (type.equals(MainActivity.SER_TYPE)) {
- // 获取Serializable对象
- PersonSer personSer = (PersonSer) getIntent().getSerializableExtra(
- MainActivity.SER_KEY);
- sb.append("----From Serializable----").append("\n");
- sb.append("Name:").append(personSer.getName()).append("\n");
- sb.append("Age:").append(personSer.getAge()).append("\n");
- } else if (type.equals(MainActivity.PAR_TYPE)) {
- // 获取Parcelable对象
- PersonPar personPar = (PersonPar) getIntent().getParcelableExtra(
- MainActivity.PAR_KEY);
- sb.append("----From Parcelable----").append("\n");
- sb.append("Name:").append(personPar.getName()).append("\n");
- sb.append("Age:").append(personPar.getAge()).append("\n");
- }
附源码:下载地址
运行结果截图:


在Android中通过Intent使用Bundle传递对象的更多相关文章
- Android,使用Intent或Bundle传递参数,跳转页面。
(1)使用Intent跳转页面: 第一个activity:MainActivity.java中: Intent myIntent = new Intent(); myIntent.putExtra(& ...
- Android中的Parcel机制 实现Bundle传递对象
Android中的Parcel机制 实现了Bundle传递对象 使用Bundle传递对象,首先要将其序列化,但是,在Android中要使用这种传递对象的方式需要用到Android Parc ...
- 【转】Android中如何使用Bundle传递对象[使用Serializable或者Parcelable] -- 不错
原文网址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1211/694.html Android中Bundle类的作用 Bun ...
- android中使用Intent在activity之间传递数据
android中intent传递数据的简单使用: 1.使用intent传递数据: 首先将需要传递的数据放入到intent中 Intent intent = new Intent(MainActivit ...
- android中通过intent传递复杂数据
android中在各个service或者acitivity之间可以通过Intent来传递一些数据,intent原生直接提供了一些简单数据类型的数据的传递,使用起来也很方便,比如int boolean ...
- Android 用Intent和Bundle传递参数
传递方: //点击btn_sub传递 fieldHeight.getText()和 fieldWeight.getText() private void setListeners() { ...
- Android中目的地Intent的使用
一.什么是Intent? Intent的中文意思是目的.在Android中也是“目的”的意思.就是我们要去哪里,从这个activity要前往另一个Activity就需要用到Intent. 示例代码一: ...
- Android中的intent属性
android之Intent的七大属性 2015年04月03日 ⁄ Android ⁄ 共 14866字 ⁄ 字号 小 中 大 ⁄ 1条评论 Intent用于封装程序的“调用意图”.两个Activit ...
- Android 中的 Intent 简介
Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据. ------------------------------- ...
随机推荐
- ElasticSearch实践系列(二):探索集群
前言 为了方便ELK的逐步搭建,我们本篇文章先安装Kibana,然后用Kibana的DevTols执行命令.也可以安装elasticsearch-head运行命令. 安装Kibana 参考Instal ...
- JVM规范系列第1章:引言
如果你还没下载<Java虚拟机规范>这本书,那么先点击这里下载再一块儿看吧. 前言 Java 虚拟机是一个抽象化的机器,整个规范中提及的 Java 虚拟机都是抽象化的概念,而不是特指 Or ...
- 运维中的日志切割操作梳理(Logrotate/python/shell脚本实现)
对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的轮 ...
- Python_初识函数和返回值_22
#len s = '金老板小护士' len(s) def my_len(): #自定义函数 i = 0 for k in s: i += 1 print(i) length = my_len() pr ...
- C. Books Queries
链接 [http://codeforces.com/contest/1066/problem/C] 题意 开始空队列,可以进行前插和后插,还可以查询使某个数的为最左或最右需要去掉的最少数字 分析 模拟 ...
- 作业20171102 beta1 成绩
申诉 对成绩有疑问或不同意见的同学,请在群里[@杨贵福]. 申诉时间截止2017年12月12日 17:00. 成绩 scrum01 scrum02 scrum03 scrum04 scrum05 sc ...
- 第二次作业 对VC++6.0编译软件的评价
首先这个软件伴随着我们很长时间了,它是我们一上大学最先接触的,也是应用相当多的一个软件,其实在最初的时候,我对编译软件的理解非常有限,觉得它能实现一个代码的功能十分神奇的一件事情,虽然彼时我们写的代码 ...
- spring cloud bus原理总结
1.spring cloud bus spring cloud是按照spring的配置对一系列微服务框架的集成,spring cloud bus是其中一个微服务框架,用于实现微服务之间的通信. spr ...
- react-native 基础知识的学习
react已经用了半年多了,年后有时间想探究一下奇妙的react-native,还别说确实刁,具体哪里刁后面会补充,因为搭建教程,以及入门教程没来得及写,这里先来写一些基础知识的心得. 为什么reac ...
- slot 插槽的作用域用法(摘自vue.js 官网)
有的时候你希望提供的组件带有一个可从子组件获取数据的可复用的插槽.例如一个简单的 <todo-list> 组件的模板可能包含了如下代码: <ul> <li v-for=& ...