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也同理
Android parcel 学习