简介
IPC Inter-Process Communication 跨进程通讯,两个进程之间进行数据交换的过程
在Android中的多进程一般指一个应用中存在多个进程的情况,下面讨论一个应用中多进程的情况。
开启多进程的方式
在AndroidManifest.xml文件中,给四大组件指定android:process属性即可,值为进程的名称,如下
<service
android:name="com.katherine.du.everydaystudy.up20171214.aidl.server.BookManagerService"
android:process=":remote">
</service>
<provider
android:name=".up20171214.contentprovider.remoteprovider.BookProvider"
android:authorities="com.katherine.du.everydaystudy.provider"
android:process="com.katherine.du.everydaystudy.provider">
</provider>
假设我的包名为com.katherine.du.everydaystudy,上面的BookManagerService将会运行在名为“com.katherine.du.everydaystudy:remote”的进程中,
BookProvider将会运行在“com.katherine.du.everydaystudy.provider”的进程中。
至于区别,以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中;而不以“:”开头的进程属于全局进程,其他应用通过ShareUID方式可以喝它跑在同一个进程中。
跨进程通讯方式
1. 使用Bundle
Bundle是实现了Parcelable接口的,所以可以方便地在不同的进程间携带数据。Activity、Service、Receiver都支持在Intent中传递Bundle数据。
2. 使用文件共享方式
两个进程可以通过读写同一个文件进行传递数据,但对数据同步的处理有局限性,且无法做到即时通信。
3. 使用Messenger
在不同的进程中传递Message对象,底层实现是AIDL,局限性:串行处理消息,只能通过Message的Bundle进行数据传递。
4. 使用AIDL
通过AIDL实现跨进程的方法调用,高并发实时通信,同样适用于两个应用之间。
● 首先建立一个Service和一个AIDL接口
● 创建一个类继承自AIDL接口中的Stub类并实现Stub中的抽象方法,并在Service中的onBind方法中返回这个类的对象
● 最后客户端就可以绑定服务端的Service,建立连接后即可访问服务端的方法了
5. 使用ContentProvider
系统预置了很多ContentProvider,如通讯录信息等,也可以自定义ContentProvider,只需要继承ContentProvider并实现其中的onCreate getType insert delete update query这六个方法。通常情况下,ContentProvider以表格的形式组织数据,但也支持文件数据,如图片、视频等。
6. 使用Socket套接字
此方法同样适用于两个应用之间,或不同的设备之间