如何设置多进程
AndroidManifest.xml中配置android:process=":remote"
(1)android:process=":remote"
表示在应用程序里,会自动创建新的进程;
(2)android:process="remote"
则创建全局进程,不同的应用程序共享该进程。
常见的进程间通信方式
Bundle通过Intent传递数据,文件共享,ContentProvider,基于Binder的AIDL,Messenger,Socket。
一、Activity
通过Intent跨进程启动其他进程页面,并通过Bundle传值。
Intent intent = getPackageManger().getLaunchIntentForPackage("包名");
二、Content Provider
Android应用程序可以使用文件或SqlLite数据库来存储数据。Content Provider提供了一种在多个应用程序之间数据共享的方式(跨进程共享数据)。应用程序可以利用Content Provider完成增删改查的工作。
三、Broadcast
广播是一种被动跨进程通讯的方式。当某个程序向系统发送广播时,其他的应用程序只能被动地接收广播数据。
四、Service
(一)AIDL
AIDL采用C/S架构,分为服务端和客户端。
服务端
服务端就是你要连接的进程。他提供给客户端一个Service,在这个Service中监听客户端的连接请求,然后创建一个AIDL接口文件,里面是将要实现的方法,注意这个方法是暴露给客户端的。最后在Service中实现这个AIDL接口即可(这里是接口的具体实现)。服务端的职责是提供连接和自身。客户端
客户端首先需要绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转换成AIDL接口所属的类型,最后调用AIDL的方法就可以了。客户端负责连接和调用。
AIDL支持的数据类型有
- 基本数据类型(int、long、char、boolean、double、float、byte、short)
- String和CharSequence
- List:只支持ArrayList,并且里面的每个元素必须被AIDL支持
- Map:只支持HashMap, 同样的,里面的元素都必须被AIDL支持,包括key和value
- Parcelable:所有实现了Parcelable接口的对象
- AIDL:所有的AIDL接口本身也可以在AIDL 文件中使用
(二)Messenger
Messenger本质也是AIDL,只是进行了封装。
Messenger处理Client端的请求是单线程的,而AIDL是多线程的。
Client的方法,使用AIDL获取返回值是同步的,而Messenger是异步的。