Parcel 在英文中有两个意思,其一是名词,为包裹,小包的意思; 其二为动词,意为打包,扎包。邮寄快递中的包裹也用的是这个词。Android采用这个词来表示封装消息数据。这个是通过IBinder通信的消息的载体。需要明确的是Parcel用来存放数据的是内存(RAM),而不是永久性介质(Nand等)。

Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口。一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。

接口的定义如下:

public interface Parcelable {
//内容描述接口,基本不用管
public int describeContents();
//写入接口函数,打包
public void writeToParcel(Parcel dest, int flags);
//读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入。
//为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例。
public interface Creator<T> {
public T createFromParcel(Parcel source);
public T[] newArray(int size);
}

在实现Parcelable的实现中,规定了必须定义一个静态成员, 初始化为嵌入接口的实现类。

       public static Parcel.Creator<DrievedClassName>  CREATOR =
new Parcel.Creator<DrievedClassName>(); 

下面定义了一个简单类MyMessage, 他需要把自身的数据mdata,打入包中。 同时在消息的接收方需要通过MyMessage实现的Parcelable接口,将MyMessage重新构造出来。

import android.os.Parcel;
import android.os.Parcelable;
public class MyMessage implements Parcelable {
private int mData;
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
}
public static final Parcelable.Creator<MyMessage> CREATOR
= new  Parcelable.Creator<MyMessage>(){
public MyMessage createFromParcel(Parcel in) {
return new MyMessage(in);
}
public MyMessage[] newArray(int size) {
return new MyMessage[size];
}
};
private MyMessage(Parcel in) {
mData = in.readInt();
}
public MyMessage(int data) {
// TODO Auto-generated constructor stub
mData = data;
}
}

Parcel 和 Parcelable相关推荐

  1. Android之Parcel和Parcelable

    总结: Parcel 类是一个容器,能装各种类型的数据,并能在C/CPP底层传输. Parcel 可以在Binder 驱动为不同进程实现数据交互,为什么它能充当这样的角色呢? 系统设计使然.虽然不同进 ...

  2. Android源码分析 - Parcel 与 Parcelable

    0. 相关分享 Android-全面理解Binder原理 Android特别的数据结构(二)ArrayMap源码解析 1. 序列化 - Parcelable和Serializable的关系 如果我们需 ...

  3. Android Parcel和Parcelable类

    1. Parcel类 Parcel主要用于在进程间通讯,传递数据. Parcel通过obtain()静态方法获取,数据的存储和读取主要通过writeXXX()和readXXX()实现,marshall ...

  4. Android | 序列化Serializable/Parcelable 使用总结

    本文已同步发表于我的微信公众号,搜索 代码说 即可关注,欢迎与我沟通交流. 文章目录 一.什么是序列化?为什么要序列化?怎么进行序列化? 二.Serializable 2.1 序列化举例 2.2 重写 ...

  5. java parcelable list_Kotlin parcelable和arrayList of parcelables

    我正在尝试编写一个可分配的数据对象,以便在我的Android应用程序中从 activityA 传递到 activityB . 我的对象是传递所有数据,除了我的可用服务类 arraylist data ...

  6. Android 跨进程通信基础

    2019独角兽企业重金招聘Python工程师标准>>> Android跨进程通信基础--Binder, BinderProxy, parcel, parcelable, Stub, ...

  7. Android AIDL使用介绍(2)自定义数据类型的传递

    1.背景 默认情况下,AIDL只支持下列数据类型: Java八种基础数据类型(如 int.long.char.boolean 等); String字符串: CharSequence字符序列: List ...

  8. android基础 [超级详细android Activity组件解析(Activity综述,Activity生命周期,Activity启动--携带参数启动)]

    1 章节目录 2 Android Activity综述 2.1 Activity怎么用 2.2 layout - 界面布局 2.3 Java - 控制界面 2.4 AndroidManifest.xm ...

  9. Android 自带的应用统计服务(UsageStatsService)

    最近要弄在 framework 中弄一个统计应用使用时长的功能.刚开始想着要怎么是不是要在 ActivityManagerService(AMS)的几个 Activity 的生命周期那埋几个统计点,后 ...

最新文章

  1. R语言使用car包的scatterplot函数根据分组变量在不同的分组拟合不同的模型并在散点图中可视化每个分组的拟合曲线、并添加边缘箱图
  2. openssl生成自签证书
  3. anaconda powershell prompt 启动vscode_记一个VS Code终端显示问题的较完美解决
  4. 《研磨设计模式》chap4 适配器模式Adapter
  5. Mysql学习笔记之常用数据类型
  6. HLS—AXI4-Lite Interface
  7. jquery flot pie画饼图
  8. 更新jupyter lab
  9. html5和html的区别是什么?学HTML5要不要学html?
  10. 语音识别kaldi该如何学习?
  11. slam 图像处理 matlab,MATLAB R2020a图像处理和计算机视觉新进展
  12. 申屠青春对“链”和“币”的再思考
  13. JavaAwtSwing笔记之 Frame和JFrame的区别
  14. Oracle EBS AutoConfig详解
  15. Linux操作系统普通用户与root之间的切换
  16. python大全-iwanna
  17. 数据库 SQL 语句学习
  18. uniapp:一个多边形图片裁剪插件
  19. 恭喜猛龙获得NBA总冠军
  20. 华为智慧屏v98摄像头像素是多少

热门文章

  1. 智能对话机器人设计全流程
  2. 共轭梯度法解求解大规模稀疏矩阵,对比最速梯度法(C++)
  3. 关于Latex 引用参考文献时,bibliography{}以及bibliographystyle{}位置的问题
  4. Android移植librtmp
  5. 最后一面《HR面》------十大经典提问
  6. 在ubuntu下完美安装RTX(解决离线、乱码问题)
  7. python趣味编程从入门到人工智能答案-趣味编程挑战:从Python入门到AI应用
  8. Docker3 - Dockerfile 配置文件
  9. C++ std iostream
  10. OpenCV 中设置system (“color 5E”) 的含义是什么?