Android跨进程通信
Android开启多进程的方式只有一个,就是在AndroidManifest中指定Android:Process属性
Intent
用于三大组件(Activity、Service、Receive)之间的通信,其中通过Bundle来跨进程传递。
文件共享
跟Linux一样,没啥好说的
Messageer
Messager有两个构造方法,可以在同进程内用于Handler通信,也可以跨进程用于IBinder通信。
Messenger(Handler target)
Create a new Messenger pointing to the given Handler.
Messenger(IBinder target)
Create a Messenger from a raw IBinder, which had previously been retrieved with getBinder().
Messager通过Message来传递消息,在同进程内可以通过object参数传递对象,跨进程可以通过setData(Bundle bundle)来传递数据。
AIDL
AIDL是Android的一套规范,系统默认支持的类型有:1. 基本类型;2. String,CharSequence;3. List(ArrayList)和 Map(HashMap),key和value的数据都必须支持Parcelable;4. 实现了parcelable的类型;5. AIDL接口本身(AIDL中自定义的Parcelable的对象必须也要定义AIDL文件);
AIDL是基于Binder机制的,Android在编译aidl文件时,会自动生成binder的java类,关键是内部类Stub,asInterface方法,如果在同进程,直接返回stub对象,不同进程中返回Stub.proxy对象(proxy调用transact发送方法调用,stub通过onTransact接收);
Socket
TCP和UDP的方式
ContentProvider
跨进程是基于Binder机制的。
只有onCreate方法时运行在主线程中的,其余操作都是运行在binder线程池。
在AndroidManifest.xml中指定唯一的URI标识符,其它组件通过该标识符访问。
ContentProvider是运行在自己的进程中的,其它的进程访问数据的操作都是在它自己的进程中,可以做到进程安全。
可以自定义Permission,从而限制其它进程的访问;
Serialize和Parcelable序列化
Serialize是java的序列化接口,主要用于通过网络或者文件序列化的场景,关键点有两个:1. 独一无二的serialVersionUID值,和transient属性可以标记某个字段不参与序列化。
Parcelable是Android的方式,主要用于存储在内存上的序列化。Android中的Intent、Bundle、BitMap、List、Map都支持序列化。