Android跨进程通信

773 阅读2分钟

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都支持序列化。