Android IPC(Inter-Process Communication)
就是Android
的跨进程通信,Android
开发有时需要进行多进程的开发,要进行多进程之间的通信,那样就需要 IPC
的知识了 。下面先介绍一下多进程使用场景,再分别介绍一下几种 IPC
方式。
多进程使用场景:
- 分担主进程的内存压力。
- 防止主线程被杀死,创建一个守护进程,守护主进程。
-
Android
开发中有些特殊的模块需要在一个单独的进程中。 - 当前应用需要向另外一个应用获取数据。
介绍几种IPC
方式之前要先介绍一下Binder
:
从IPC
角度来看,Binder
是 Android
中的一种跨进程通信方式,从Android
应用层来看,Binder
是客户端与服务端进行通信的媒介,当bindService
时,服务端就会返回一个包含了服务端业务调用的Binder
对象,通过这个Binder
对象,客户端就可以获取服务端的数据或调用服务端的AIDL
接口中的方法。下面的Messenger
,AIDL
等IPC
方式底层都是通过Binder
来实现进程间通信的。
几种IPC
方式:
Bundle
- 文件共享
Messenger
AIDL
ContentProvider
-
Socket
以上几种IPC
方式各有优缺点,使用场景也各有不同,使用时应该考虑这些选择合适的IPC
方式来进行跨进程通信。
几种IPC
方式的具体分析:
一,Bundle
Intent
可以启动其他进程中的四大组件,所以Intent+Bundle(Intent.putExtras(Bundle))
可以方便地向其他进程的四大组件传递一些数据,不过局限性也出来了,只能在启动时向四大组件传递数据。
二 ,文件共享
文件共享就是在一个进程中将数据写入文件中,然后在另外一个进程中去读取那个文件,这样就也可以进行跨进程通信。不过多线程直接对文件的读写,可能会出现问题,所以这种方式不适合高并发性的跨进程通信。
三, Messenger
Messenger
,信使,通过它可以在不同的进程中传递 Message
对象,在Message
中放入我们需要的传递的数据,用Handler
来处理 Message
,这样就可以进行进程间数据传递了,Messenger
是一种轻量级IPC
方案,它的底层实现是AIDL
,Messenger
是只能用来传递消息的。
四,AIDL
AIDL(Android Interface Definition Language,Android接口定义语言)
是一种IDL
语言,是用来生成可以在 Android
设备上两个进程之间进行进程间通信 (IPC
) 的代码的,当然也可以不使用AIDL
,自己直接模仿着编写这部分代码,AIDL
也是使用Binder
来进行进程间通信的,这种 IPC
方式可以跨进程调用方法。AIDL
跨进程通信的大致流程是:创建一个Service作为服务端和一个AIDL
接口,接口中声明要使用的方法,再创建一个类继承自这个AIDL
接口中的 Stub
类并实现AIDL
接口中声明的抽象方法,然后在onBind()
方法中返回这个类的对象给客户端,就是一个Binder
对象,这样在客户端就可以通过这个Binder
对象调用服务端的中AIDL
接口中的方法了。
五,ContentProvider
ContentProvider
是系统提供的数据共享型组件,是用于不同组件乃至不同应用间共享数据的,所以也可以用来跨进程通信, ContentProvider
的底层实现的是Binder
,但是它的使用比 AIDL
的要简单,根据``ContentProvider的特性,ContentProvider
适合要在大量数据中提取出一部分数据来进行跨进程通信的场景。
六,Socket
通过Socket
来进行跨进程通信,如果是同一手机中的两个进程就直接进行局域网(localhost
)通信,如果两个进程是处于不同手机就需要使用网络来通信了。Socket
是一个抽象层,其实是封装了TCP/IP
协议,然后提供一些API
来进行网络通信,Socket
通信较为简单,只需要提供 ip
和端口号就可以了。
参考 《Android开发艺术探索》