Android parcel 学习

工作中遇到了需要处理安卓IPC通信的情况,安卓IPC通信即binder通信通过Parcel类来传递数据,记录一下Parcel的使用方法

Parcel 如何储存数据

Parcel使用序列化的方法储存数据,本身采用二进制流+偏移量的形式存储数据,也可以理解为文件句柄中的文件流指针

常用方法

obtain()

parcel的构造方法,用来构造一个空parcel

dataSize()

返回parcel对象内存储的数据量

dataPosition()

获取当前parcel对象的流指针偏移量

setDataPosition()

设置当前parcel对象的流指针偏移量

recyle()

回收当前parcel对象的内存,相当于delete

write/read XXX

往parcel里写/读数据,这个数据可以是任意的类型,只要是继承了Parcelable即可序列化即可,writeInt这种自然支持,此外还有writeTypedObject这种可以支持复杂的数据结构,在写入后指针偏移量会自动向后移动
注意到一个Parcel的读写行为都共用一个指针偏移,所以如果写入了东西后要读取则需要重新设置偏移量

writeException()

往Parcel头写入异常,与之相对的是writeNoException用于写入无异常

readException()

读取Parcel头,如果Parcel头写入的是异常就抛出该异常,否则不做任何处理

对齐方式

Parcel中采用四字节对齐,如果是小于等于四字节的类型会对齐到四字节储存,大于四字节的则按4bytes的倍数储存,但dataPostion还是按照一个字节为单位设置偏移量的,dataSize也同理

Author

SGSG

Posted on

2025-06-19

Updated on

2025-06-19

Licensed under