6.0 前言
1、要进行进程间通信的原因
不同的进程运行在不同的内存空间,所以无法直接通过内存地址来访问别的进程的数据。Binder的存在就可以给我们提供一种间接的方法进行进程间的通信。
2、Binder的组成部分
- Binder驱动:运行于内核层,可以提供open(),ioctl(),mmap()等常用的文件操作
- ServiceManager:保存所有Binder Server。
- Binder Client
- Binder Service
6.1 智能指针
1、用于解决C/C++中多个指针问题
- 指针没有初始化
- new对象后没有及时delete
- 野指针
2、智能指针的设计
内存对象 object:具有引用计数器,当引用数为0时销毁对象
弱指针:用于避免对象间相互引用在内存回收时产生的死锁,因为此时两对象都被对方所需要而不能释放,所以规定只要强指针为0就可以回收,wp要升级为sp才能访问它所指的目标对象
6.2 进程间的数据传递载体 – Parcel
将数据通过Parcel“打包”,方便进行间传输
- 主数据类型以及他们的数组可以通过Parcel打包传递
- Parcelable 是一个接口,实现该接口的对象可以通过Parcel存取
- Bundle 实现了Parcelable 接口,以键值对的方式存储数据,是一个载体容器
- Active Object是Parcel的一个强大武器
通常存入Parcel的是对象的内容,而这个写入的是对象的特殊标志引用,当读取时可以得到原来被写入的实例,而通过普通Parcel读取到的是新的对象。
以这种方式传输的对象有2个:
1、 Binder
2、FileDescriptor
- Parcel 的内部实现
Parcel 只是一个中介,最终所有类型的读写操作都通过本地代码来完成(JNI)
writeString的实现原理:
1、writeInt32:写入长度
2、memcpy:写入数据本身
3、padding:填充
6.3 Binder驱动与协议