一.什么是IPC
IPC是Inter-Process Communication的缩写,含义是进程间通信和跨进程通信,是指两个进程直接进行数据交换的过程。
二.什么情况下需要使用多进程
1.一些模块因为特殊原因需要运行在单独进程中
2.Android开发时对单个应用的最大内存做了限制,为了防止主线程被杀死,可以创建多线程来减少内存溢出
3.当前应用需要向另外一个应用获取数据
三.Android IPC
1.Android中IPC有哪些方式
(1)Bundle:在Bundle中附加数据并通过Intent传输
(2)文件共享:两个进程通过读写一个文件来交换数据
(3)AIDL:Android Interface Definition Language
(4)Messenger:基于消息的进程间通信
(5)ContentProvider::专门用于不同应用间的数据共享
(6)Socket:使用TCP和UDP协议进行网络通信
2.Android中IPC适合的场景及优缺点
注:BroastcastReceiver也是一种IPC
四.Android几种IPC方式的具体分析:
1. Bundle
Bundle应该是我们最熟悉的了,Intent启动四大组件时,可以用Bundle携带数据。
Bundle bundle = new Bundle();
bundle.putString("test","msg")
Intent intent = new Intent();
intent.putExtras(bundle);
startActivity(intent);
不过毕竟尴尬的是,Bundle只能在启动时向四大组件传递数据。
2.文件共享
文件共享就是在一个进程中将数据写入文件中,然后在另外一个进程中去读取那个文件,这样就也可以进行跨进程通信。不过多线程直接对文件的读写,可能会出现问题,所以这种方式不适合高并发性的跨进程通信。
3.AIDL
AIDL(Android Interface Definition Language,Android接口定义语言)是一种IDL语言,是用来生成可以在 Android 设备上两个进程之间进行进程间通信 (IPC) 的代码的,当然也可以不使用AIDL,自己直接模仿着编写这部分代码,AIDL也是使用Binder来进行进程间通信的,这种 IPC方式可以跨进程调用方法。AIDL跨进程通信的大致流程是:创建一个Service作为服务端和一个AIDL接口,接口中声明要使用的方法,再创建一个类继承自这个AIDL接口中的 Stub类并实现AIDL接口中声明的抽象方法,然后在onBind()方法中返回这个类的对象给客户端,就是一个Binder对象,这样在客户端就可以通过这个Binder对象调用服务端的中AIDL接口中的方法了。
4.Messenger
Messenger,信使,通过它可以在不同的进程中传递 Message对象,在Message中放入我们需要的传递的数据,用Handler来处理 Message,这样就可以进行进程间数据传递了,Messenger是一种轻量级IPC方案,它的底层实现是AIDL,Messenger是只能用来传递消息的。
5.ContentProvider
ContentProvider是系统提供的数据共享型组件,是用于不同组件乃至不同应用间共享数据的,所以也可以用来跨进程通信, ContentProvider的底层实现的是Binder,但是它的使用比 AIDL的要简单,根据ContentProvider的特性,ContentProvider
适合要在大量数据中提取出一部分数据来进行跨进程通信的场景。
6.Socket
通过Socket来进行跨进程通信,如果是同一手机中的两个进程就直接进行局域网(localhost)通信,如果两个进程是处于不同手机就需要使用网络来通信了。Socket是一个抽象层,其实是封装了TCP/IP协议,然后提供一些API来进行网络通信,Socket通信较为简单,只需要提供 ip和端口号就可以了。