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方式:

  1. /**
  2. * PersonSer
  3. *
  4. * @author http://blog.csdn.net/zuolongsnail
  5. */
  6. public class PersonSer implements Serializable {
  7. /**
  8. * serialVersionUID的作用是在修改实体类后,可以正常的序列化和反序列化,在此不多说,大家可以谷歌百度下。
  9. */
  10. private static final long serialVersionUID = -7620435178023928252L;
  11. private String name;
  12. private int age;
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public int getAge() {
  20. return age;
  21. }
  22. public void setAge(int age) {
  23. this.age = age;
  24. }
  25. }

Parcelable方式:

  1. /**
  2. * PersonPar
  3. *
  4. * @author http://blog.csdn.net/zuolongsnail
  5. */
  6. public class PersonPar implements Parcelable {
  7. private String name;
  8. private int age;
  9. public String getName() {
  10. return name;
  11. }
  12. public void setName(String name) {
  13. this.name = name;
  14. }
  15. public int getAge() {
  16. return age;
  17. }
  18. public void setAge(int age) {
  19. this.age = age;
  20. }
  21. /**
  22. * 序列化实体类
  23. */
  24. public static final Parcelable.Creator<PersonPar> CREATOR = new Creator<PersonPar>() {
  25. public PersonPar createFromParcel(Parcel source) {
  26. PersonPar personPar = new PersonPar();
  27. personPar.name = source.readString();
  28. personPar.age = source.readInt();
  29. return personPar;
  30. }
  31. public PersonPar[] newArray(int size) {
  32. return new PersonPar[size];
  33. }
  34. };
  35. @Override
  36. public int describeContents() {
  37. return 0;
  38. }
  39. /**
  40. * 将实体类数据写入Parcel
  41. */
  42. @Override
  43. public void writeToParcel(Parcel parcel, int flags) {
  44. parcel.writeString(name);
  45. parcel.writeInt(age);
  46. }
  47. }

第二步:传递序列化对象;

  1. Intent intent = new Intent(MainActivity.this, DestActivity.class);
  2. Bundle bundle = new Bundle();
  3. switch (v.getId()) {
  4. case R.id.serializable_btn:
  5. // Serializable传递对象
  6. PersonSer personSer = new PersonSer();
  7. personSer.setName("zuolong");
  8. personSer.setAge(26);
  9. bundle.putSerializable(SER_KEY, personSer);
  10. intent.putExtra("type", SER_TYPE);
  11. intent.putExtras(bundle);
  12. startActivity(intent);
  13. break;
  14. case R.id.parcelable_btn:
  15. // Parcelable传递对象
  16. PersonPar personPar = new PersonPar();
  17. personPar.setName("snail");
  18. personPar.setAge(27);
  19. // Bundle有putParcelableArray和putParcelableArrayList方法,也就可以传递数组和列表
  20. bundle.putParcelable(PAR_KEY, personPar);
  21. intent.putExtra("type", PAR_TYPE);
  22. // Intent也有putParcelableArrayListExtra方法,可以传递实现Parcelable接口的对象列表
  23. intent.putExtras(bundle);
  24. startActivity(intent);
  25. break;
  26. }

第三步:获取对象;

  1. StringBuffer sb = new StringBuffer();
  2. String type = getIntent().getStringExtra("type");
  3. // 根据type判断是哪种类型
  4. if (type.equals(MainActivity.SER_TYPE)) {
  5. // 获取Serializable对象
  6. PersonSer personSer = (PersonSer) getIntent().getSerializableExtra(
  7. MainActivity.SER_KEY);
  8. sb.append("----From Serializable----").append("\n");
  9. sb.append("Name:").append(personSer.getName()).append("\n");
  10. sb.append("Age:").append(personSer.getAge()).append("\n");
  11. } else if (type.equals(MainActivity.PAR_TYPE)) {
  12. // 获取Parcelable对象
  13. PersonPar personPar = (PersonPar) getIntent().getParcelableExtra(
  14. MainActivity.PAR_KEY);
  15. sb.append("----From Parcelable----").append("\n");
  16. sb.append("Name:").append(personPar.getName()).append("\n");
  17. sb.append("Age:").append(personPar.getAge()).append("\n");
  18. }

附源码:下载地址

运行结果截图:


在Android中通过Intent使用Bundle传递对象的更多相关文章

  1. Android,使用Intent或Bundle传递参数,跳转页面。

    (1)使用Intent跳转页面: 第一个activity:MainActivity.java中: Intent myIntent = new Intent(); myIntent.putExtra(& ...

  2. Android中的Parcel机制 实现Bundle传递对象

    Android中的Parcel机制    实现了Bundle传递对象    使用Bundle传递对象,首先要将其序列化,但是,在Android中要使用这种传递对象的方式需要用到Android Parc ...

  3. 【转】Android中如何使用Bundle传递对象[使用Serializable或者Parcelable] -- 不错

    原文网址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1211/694.html Android中Bundle类的作用 Bun ...

  4. android中使用Intent在activity之间传递数据

    android中intent传递数据的简单使用: 1.使用intent传递数据: 首先将需要传递的数据放入到intent中 Intent intent = new Intent(MainActivit ...

  5. android中通过intent传递复杂数据

    android中在各个service或者acitivity之间可以通过Intent来传递一些数据,intent原生直接提供了一些简单数据类型的数据的传递,使用起来也很方便,比如int boolean ...

  6. Android 用Intent和Bundle传递参数

    传递方: //点击btn_sub传递 fieldHeight.getText()和 fieldWeight.getText() private void setListeners()    {    ...

  7. Android中目的地Intent的使用

    一.什么是Intent? Intent的中文意思是目的.在Android中也是“目的”的意思.就是我们要去哪里,从这个activity要前往另一个Activity就需要用到Intent. 示例代码一: ...

  8. Android中的intent属性

    android之Intent的七大属性 2015年04月03日 ⁄ Android ⁄ 共 14866字 ⁄ 字号 小 中 大 ⁄ 1条评论 Intent用于封装程序的“调用意图”.两个Activit ...

  9. Android 中的 Intent 简介

    Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据. ------------------------------- ...

随机推荐

  1. [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [二] 基本使用

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 五.如何做全站采集 使用环境 Visual Studio 2017 .NET ...

  2. 20min 快速着手Markdown

    目录 Markdown介绍和基本使用 初步介绍 markdown的使用场景 为什么是 Markdown markdown的基本语法和使用平台 Q&A: Markdown介绍和基本使用 初步介绍 ...

  3. JMeter:响应结果乱码解决方法

    JMeter:响应结果乱码解决方法 我们经常使用jmeter做接口测试或者正则匹配 看到的响应结果存在乱码,这是小白经常会问的问题,这是因为jmeter会按照jmeter.properties文件中, ...

  4. 时区提示:Local time zone must be set--see zic manual page 2018的解决办法

    问题描述:在centos服务器上执行date命令时,显示的时间信息中的时区不正常,如下: [root@ulocalhost ~]# date Mon Apr 9 02:57:38 Local time ...

  5. Linux下FTP环境部署梳理(vsftpd和proftpd)

    在日常运维工作中,常部署到的FTP是vsftpd和proftd.之前写了Linux下FTP虚拟账号环境部署总结,下面简单说下本地用户下的FTP环境部署过程: 简单梳理下FTP主动和被动两种工作模式: ...

  6. 使用requests库提交multipart/form-data 格式的请求

    前言: Requests是用Python语言编写,基于urllib,采用Apache2 Licensed开源协议的HTTP库.它比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求 ...

  7. mysql 编码和汉字存储占用字节问题的探索

    MySql 5.5 之前,UTF8 编码只支持1-3个字节,只支持BMP这部分的unicode编码区,BMP是从哪到哪?基本就是 0000 ~ FFFF 这一区. 从MySQL 5.5 开始,可支持4 ...

  8. D. Fun with Integers

    链接 [http://codeforces.com/contest/1062/problem/D] 题意 给你n,让你从2到n这个区间找任意两个数,使得一个数是另一个的因子,绝对值小的可以变为绝对值大 ...

  9. beta阶段性能指标测试

    性能指标概况 安装耗时 启动耗时 CPU占用 内存占用 电池温度 网络流量 平均值 5.48s 1.04s 1.61% 18.68MB 32.44℃ 93.78B 峰值 131.74s 5.13s 5 ...

  10. 我的github地址 https://github.com/1010de/Test.git

    构建之法老师叫交下任务学习github,经过一段时间的学习和了解,看介绍.看视频.看博客.初步认识到github的方便与好处.     自己试着去注册和使用github,已经慢慢学会了一些基本操作. ...