IPC机制
- IPC简介
Inter-Process Communication 进程间通信/跨进程通信----指两个进程间进行数据交换的过程。
Android中进程间通信的方式是通过Binder方式
- Android开启多进程方式
- 给四大组件在AndroidManifest中指定android:process属性
- 通过JNI在native层fork一个新的进程(不常用)
- 进程名以:开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,
- 进程名不以:开头的进程属于全局进程,其他应用通过ShareUID的方式可以和它跑在同一个进程中,需要两个应用有相同的ShareUID和签名,这样他们就可以互相访问私有数据。
- 多进程的问题
一个静态变量,在不同进程中修改它的值,不会同步到其他进程中,每个进程只会持有该静态变量的副本。
Android为每个应用分配一个独立的虚拟机,或者说每个进程分配一个独立的虚拟机,不同的虚拟机在内存地址分配上有独立的地址空间,这就会使在不同的虚拟机中访问同一个对象会产生多个副本
- 实现跨进程通信的方式举例:
Intent传输数据,共享文件和sharedpreference,基于Binder的Messenger,AIDL和Socket
- 序列化Serializable中有个SerialVersionUID,作用:该id被序列化到文件中,当反序列化时,会取出该id与当前类的id比较,如果不一样,表示类中的属性发生了变化,一般是编译器自己通过hash计算生成,如果手动指定,则修改类不会报错。
- 静态成员变量属于类,不属于变量,不会参与序列化
- 用transient标记的变量不参与序列化过程
- Parcelable接口
一个类只要实现该接口,就可以实现序列化并通过Intent和binder传递
- List Map也可以序列化,前提是内部元素可序列化
- Parcelable主要用在内存序列化上
- AIDL自动生成的java文件 p48
-
Binder的工作机制p50
- 通过给Binder设置死亡代理,linkToDeath和unLinkToDeath p60
- Messenger,基于AIDL实现,使用p66
- AIDL 支持的数据类型:
- 基本数据类型(int boolean long char double等)
- String 和 CharSequence
- List 只支持ArrayList,里面每个元素都必须被AIDL支持
- Map 只支持HashMap,里面每个元素都必须被AIDL支持,包括key和value,
- Parcelable :所有实现了Parcelable接口的对象
- AIDL所有的AIDL接口本身也可以在AIDL文件中使用
AIDL中除了基本数据类型外,其他数据类型必须都标上方向:in,out或inout,in表示输入型参数,out表示输出型,inout 表示输入输出型
- RemoteCallBackList 系统专门提供用于删除跨进程listener接口的。
底层是一个Map key为binder类型,value为listener接口类型,原理就是listener所对应的binder是唯一的。
- SQLiteDatabase内部对数据库操作是有同步处理的。但如果有多个SQLiteDatabase,则无法保证线程间的同步
- Binder 连接池 (p117)
大致是有多个业务Binder,然后创建一个Binder管理的AIDL文件,用于根据类型返回不同业务binder,然后服务端Service 只与管理Binder打交道,接收管理Binder返回的Binder,客户端则根据管理Binder查询自己需要的Binder再调用业务逻辑即可,这样就实现了简单的Binder连接池。
-
各种AIDL实现的优缺点及使用场景