Android中可以跨进程传递的数据类型

进程间的数据传递是Binder机制的重要环节,负责这一任务的parcel

如在往binder驱动写入数据,或者读取binder驱动返回的数据,都是parcel类型的。

onTransact(Parcel &data, Parcel* reply,)


parcel的原理是把进程A中的对象数据打包发到进程B,然后进程B在把这个数据拆包还原。

parcel支持的数据类型非常多,通过Parcel.hParcel.java可以看到原始数据类型都是可以通过parcel传递的,有其对象的读写方法。

除了原始数据类型外,原始数据类型的数组也有相应的读写方法。

对于自定义的一些对象,如果其遵循Parcelable协议,也是可以通过parcel来读取的,比如ActivityonCreate()函数中用到的Bundle就继承了Parcelable,通过Intent传递参数也是写入到Bundle中的,其对应的读写方法是:

writeParcelable(constParcelable& parcelable);

readParcelable(Parcelable*parcelable) const;

public final class Bundle extends BaseBundle implements Cloneable,Parcelable {}

不管是原始数据类型,还是继承自Parcelable的自定义对象,他们存入parcel的都是这些对象的内容,还有一种数据类型,存入parcel的是它们的特殊标志引用,这类数据通常有两种,一种是BinderBinder除了是系统IPC的机制之外,它本身也是一个对象,对应的读写方法是:

status_t Parcel::writeStrongBinder(const sp<IBinder>& val)

sp<IBinder> Parcel::readStrongBinder() const{}

这个Bundlejava层的对象。

public final class Bundle extends BaseBundle implements Cloneable,Parcelable {}

另一种是文件描述符FileDescriptor,对应的读写方法:

status_t Parcel::writeFileDescriptor(int fd, bool takeOwnership)

int Parcel::readFileDescriptor() const{}

这两种数据类型传递后的对象仍然会基于和原对象相同的文件流进行操作。在对它们的读写过程中,对数据的处理都是以flat_binder_object这个结构体来描述的。flat_binder_object是一个可以在进程间传递的Binder对象的flattened描述符。


通过看Parcel.hwrite方法的定义:

template<typenameT>

status_t Parcel::write(const Flattenable<T>& val) {

const FlattenableHelper<T> helper(val);

return write(helper);

}

通过这个方法的定义,可以看出,继承自Flattenable的类,也是可以通过parcel读写的。Flattenable协议允许一个对象序列化自己到byte缓存中和一个文件描述符的数组中,相应的继承这个Flattenable的类,要重写:

inline status_t flatten(void*& buffer, size_t& size, int*& fds,size_t& count) const;

inline status_t unflatten(void const*& buffer, size_t& size, intconst*& fds, size_t& count);

这两个方法。

GraphicBuffer就是继承Flattenable的一个实例。

class GraphicBuffer

:public ANativeObjectBase< ANativeWindowBuffer, GraphicBuffer,RefBase >, public Flattenable<GraphicBuffer>{}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值