Android开发艺术探索 第二章 IPC
- Windows上可以通过剪切板、管道、邮槽等来进行进程间通信
- Linux可以通过命名管道、共享内容、信号量等来进行进程间通信
- android中使用多进程只有一种方法:给四大组件指定android:process 属性
- 进程名以:开头的为私有进程,否则为全局进程
- 系统会为每个应用分配唯一的UID,具有相同的UID才能共享数据
- 系统为每个进程分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间
- 多进程的问题:静态成员和单例失效;线程同步失效;sf可靠性下降;application创建多次
- sf底层是通过读写xml实现的,所以并发读写会出问题。读写有缓存策略,多进程下不可靠
- ipc不能共享内存但实现了数据交互
- Serializable: 实现接口 声明静态long常量UID(辅助序列化与反序列化过程)
- 静态成员变量和transient标记的成员变量不参与序列化
- 实现Parcelable接口可以被Intent、Binder传递,嵌套Parcelable对象的发序列化过程需要传递当前线程的上下文类加载器
- 网络传输和存储到设备有S其余用P
- Binder可以理解为虚拟的物理设备,连接Manager和ManagerService的桥梁,客户端服务端的通信媒介
- Android中Binder主要用于Service包括AIDL和Messenger
- 普通service中的Binder不涉及进程间通信
- 在Binder中传输的接口都需要继承IInterface
- asInterface将Binder对象转化为AIDL接口对象,不同进程返回代理,相同进程返回本身
- onTransact 分发Binder,利用返回false会导致客户端请求失败来做权限验证
- 客户端发起请求后,当前线程会被挂起知道服务端返回数据
- 手敲Binder 继承IInterface实现asBinder方法;实现Stub和Stub中的Proxy代理类
- Message是串行的方式处理客户端 发来的请求,不适合并发。主要用来传递消息
- AIDL支持的数据类型:基本数据类型、String、CharSequence、ArrayList、HashMap、Parcelable、AIDL接口
- AIDL参数除了基本数据类型都要标记方向,in out inout 开销不同
- AIDL接口不支持静态常量,只支持方法
- 对象跨进程传输本质上都是反序列化的过程
- RemoteCallbackList是系统专门提供的用于删除跨进程listener,因为每次传递都是一个新的对象,但是他们底层的Binder对象是同一个
- 服务端方法本身就可以执行大量耗时操作,切记不要再服务端开线程执行异步任务
- 实现自定义的ContenProvider需要继承ContentProvider实现6个抽象类CRUD onCreate getType 返回一个MIME
- ContentProvider对底层的数据存储方式没有任何要求可以是SQLite也可以是普通文件或者对象
- android:authorities是ContentProvider的唯一标识
- SQLiteHelper创建数据库
- 同一个SQLiteDatebase对象内部对数据库操作是有同步处理的
- BinderPool避免大量Service创建。通过queryBinder去获取各自对应的Binder