前言

在 Android 应用开发中,经常需要在 Activity 间传递参数,有时还需要传递 Java 对象。而传递对象有两种实现方式,一种是使类实现 android.os.Parcelable 接口,另外一种是使类实现 Serializaable
接口。

当一个类实现了 Parcelable 或 Serializaable 接口后,这个类的对象,就能通过 Intent 在 Activity 之间传递了。本文主要讲述 Parcelable 的应用,及 Parcelable 与 Serializaable 的对比。

Parcelable 的应用

使用 Parcelable 接口,让一个类对象能够打包或解包,有两个重要的步骤要做,

对象打包

对象打包,实际上就是将当前对象打包为 Parcel 对象的过程。

在实现 Parcelable 接口的类里,重写 Parcelable.writeToParcel(Parcel dest, int flags) 方法,用来将当前对象的一些域值按顺序写入到 dest 对象。代码示例如下,

import android.os.Parcel;
import android.os.Parcelable;public class ParcelableDemo implements Parcelable {private int mIntProp1;private String mStrProp2;private long mLongProp3;......@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeInt(mIntProp1);dest.writeString(mStrProp2);dest.writeLong(mLongProp3);}
}

在上面的 writeToParcel 方法中,将三个属性值依次写入到了 dest 对象,完成了对象的打包,后续传递的也是这个 Parcel 对象。

对象解包

解包的过程,实际就是将 Parcel 对象转为实际对象的过程。

对象解包时,需要在类里面提供一个类型为 Create 的 public 域,名字固定为 CREATOR,主要作用就是根据传入的 Parcel 对象,创建一个类型为 T 的对象。

CREATOR 实现了 Parcelable.Creator 接口,并实现了他的两个方法 createFromParcel(Parcel source) 和 newArray(int size) 方法。代码示例如下,

import android.os.Parcel;
import android.os.Parcelable;public class ParcelableDemo implements Parcelable {private int mIntProp1;private String mStrProp2;private long mLongProp3;public static final Creator<ParcelableDemo> CREATOR = new Creator<ParcelableDemo>() {@Overridepublic ParcelableDemo createFromParcel(Parcel source) {return new ParcelableDemo(source);}@Overridepublic ParcelableDemo[] newArray(int size) {return new ParcelableDemo[size];}};public ParcelableDemo(Parcel in) {mIntProp1 = in.readInt();mStrProp2 = in.readString();mLongProp3 = in.readLong();}......
}

在上面的代码中,通过传入的 Parcel 对象,创建出来了 ParcelableDemo 对象,完成了解包的过程。通过上面两个步骤,ParcelableDemo 对象就可以通过 Intent 在 Activity 之间传递了。

Parcelable 与 Serializable 对比

以下整理出来几点这两个接口之间的对比,

  • Parcelable 是 Android SDK 提供的一个接口,用来实现 Java 对象的打包和解包;Serializable 是 Java 提供的一个序列化和反序列化接口。
  • 使用 Parcelable 时,开发者可以自定义打包和解包规则,并且 Android 中有要求,如果没有自定义规则,很可能会无法得到预期结果。而在使用 Serializable 接口时,不进行自定义序列化和反序列化规则,也能够正常使用,所以很多情况下,在 Android 中使用 Parcelable 时,会比使用 Serializable 产生更少的垃圾对象,性能也比 Serializable 更好。
  • 当使用 Serializable 接口时,自定义序列化和反序列化规则,不会产生多余的垃圾,处理速度也会大幅提升,性能甚至会超过使用 Parcelable 接口。

下面是一张使用 Parcelable 和未自定义 Serializable 的对比图,从图中可以明显看到 Parcelable 的性能要更好,

至于使用自定义 Serializable 的对比图,有兴趣的可以试试。

总结

通过实现 Parcelable 接口,可以在 Activity 间传递自定义的 Java 对象,Android 提供了一整套机制来支持 Parcel。使用 Serializable 接口时,当没有自定义序列化规则时,性能要比使用 Parcelable 差很多。

参考链接:https://android.jlelse.eu/parcelable-vs-serializable-6a2556d51538

Android中 Parcelable 的应用,以及与 Serializable 的对比相关推荐

  1. Android中Parcelable与Serializable接口用法

    转自: Android中Parcelable接口用法 1. Parcelable接口 Interface for classes whose instances can be written to a ...

  2. Android中Parcelable接口用法 和 Serializable实现与Parcelabel实现的区别

    1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. ...

  3. Android中Parcelable接口用法

    --  通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象.也可以将Parcel看成是一个流,通过writeToPa ...

  4. android studio parcelable,Android中Parcelable的使用详解

    Parcelable与Serializable Serializable是Java为我们提供的一个标准化的序列化接口. Parcelable是Android为我们提供的序列化的接口. 对比: 1.Pa ...

  5. Android中Parcelable的原理和使用方法

    Parcelable的简单介绍 介绍Parcelable不得不先提一下Serializable接口,Serializable是Java为我们提供的一个标准化的序列化接口,那什么是序列化呢? 进行And ...

  6. 详细介绍Android中Parcelable的原理和使用方法

    今日推荐 经常阅读博客是个好习惯 推荐技术小黑屋的Blog 引言 本篇文章目的在于详细的理解Parcelable的使用,而不是死记代码 我的简书博客地址 (由于csdn的图片经常出现不显示问题,以后就 ...

  7. android.os.parcelable,Android中Parcelable如可快速生成

    之前都是自己手动实现,有时候属性比较多的时候,写着累就不说了,问题是修改的时候往往会忘记哦,然后用的时候就SB了.这种日子谁想继续呢,不要担心,大牛还是有的,于是乎就找到了"Android ...

  8. Android中Parcelable接口的应用

    在前面的一篇文章<基于Android应用开发的跨进程通信实现(IPC)>介绍了通过跨进程实现基本数值类型(String)的传递,但是有的时候,需要跨进程实现传递相对较复杂的数据(比如图片之 ...

  9. java parcelable_Android中Parcelable的作用实例解析

    这篇文章主要介绍了Android中Parcelable的作用,对于Android初学者有一定的参考学习价值,需要的朋友可以参考下 在android提供了一种类型:Parcel.被用作封装数据的容器,封 ...

最新文章

  1. [Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效
  2. linux如何卸载自带的openJdk,并且安装jdk1.8
  3. autocad不能画图_AutoCAD经典技巧!
  4. 2021固态硬盘排行前十 十大固态硬盘排名
  5. U盘中病毒,文件夹变成exe文件
  6. UVA 10105 Polynomial Coefficients
  7. C语言执行时进行窗口隐藏
  8. myeclipse8.5汉化
  9. 从李兴平到翔子 “草根站长”的简单化生存规则!
  10. 独家秘技||如何快速入门一个陌生知识领域?
  11. html5猜颜色游戏,好看漂亮的html5网页特效学习笔记(3)_猜猜下一个颜色是什么?...
  12. Vue2基础篇-21-非单文件组件
  13. select获取选中的option(包含value和text,重点是text怎么获取)
  14. Ubuntu安装迅雷,让下载变得轻松
  15. JAVA NPE 是什么,空异常
  16. LVM-HOWTO/学习笔记(五)
  17. 网络摄像头实时数据解码 yv12转换为rgb
  18. C语言读取JSON文件
  19. 鸿蒙版瑞幸咖啡开发日记(一)首页布局设计
  20. 【Python从零到壹】面向对象的封装,继承和多态

热门文章

  1. TI SAE J1772兼容电动汽车充电器参考设计TIDA-010071
  2. 【免费分享】简约大气的图片相册类织梦网站模板/DedeCMS自适应手机版图片图集网站源码下载
  3. HTML5--语义化标签
  4. 人工智能—永生or灭绝
  5. 对JSTL的认识和理解
  6. 中兴软创笔试前的一些准备
  7. 用Python爬取陈奕迅新歌《我们》10万条评论的新发现
  8. 顺序二叉树(c语言)(创建,先序遍历)(头歌)
  9. oracle长整型范围,oracle中integer和number类型
  10. 彻底关闭 输入法 讨厌的全角