记得上次阿里电话面试就问,Android中的进程间通信有哪些?当时没怎么总结过,就只说了一个AIDL。今天就来总结总结吧。
什么是进程间通信?
顾名思义,两个进程之间进行数据交换的过程,那什么又是进程呢?
说到进程我们不得不提另一个概念:线程。按照操作系统的描述,线程是CPU调度的最小单元,同时线程是一种有限的系统资源,而进程则是一个执行单元,一个进程可以包含多个线程,也就是说,进程和线程的关系是包含与被包含关系。在我们移动设备中,进程可以理解为一个程序或者一个应用。
Android中的进程间通信:
1.一个应用因为某些原因需要采用多进程的模式来实现,eg:需要更大的内存空间,Android系统限制了一个app的内存大小
2.一个应用需要向其他应用获取或者写入数据。
我们先来说说,较少遇到的情况,一个应用的多线程运行机制:
通过设置不同的 android: process="" 的属性,可将某个Activity设置到不能的进程中。Android为每个应用(进程)分配了一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生多份副本。
那我们如果使用一个应用多进程实现会遇到的问题:
静态成员、单例模式和线程同步机制失效;
SharedPreferences的可靠性下降,Application会多次创建。
接下来我们就来说说Android中运用较多的两个应用(进程)之间的通信,IPC机制。
1.使用Bundle
四大组件中的 Activity 、 Service 、 Receiver都支持,在Intent中通过 Bundle 来传递数据。
Bundle 支持传递的数据类型:
Map;基本数据类型;基本数据类型数组;ArrayList ; 序列化的数据
2.使用文件共享
两个进程对同一个文件进行读写操作,从而实现进程间的通信。但是这种方式不适合高并发场景,无法做到进程间的及时通信,我们需要尽量避免并发写操作或者可以使用线程同步来限制多个线程的写操作。所以,文件共享适合对数据同步要求不高的进程间通信。(写入文件,SharedPreferences)
3.使用Messenger
Messenger通过在不同进程中传递Message对象, 在Message之中放入我们传入的数据,这样可实现进程间通信。它的底层实现是AIDL;Messenger方法也不能很好地处理高并发情形,通过串行的方式处理客户端发来的消息,如果大量的孝心同时从客户端发送到服务端,服务端需要一个一个处理,这样Messenger就不合适了。
4.AIDL
AIDL是一个IDL语言,是通过Service进行进程间的通信,下篇文章我们会详解。
5.ContentProvider
ContentProvider是Android中提供的专门用于不能应用间进行数据共享的方式,它天生就适合进程间的通信,它的底层实现是Binder,通过URI来进行我们的访问。系统预置了许多ContentProvider,比如:通讯录信息、日程表信息等等。
6.使用Socket
这相当于是通过网络来进行的进程间通信,他是通过Socket来实现,分为流式套接字和用户数据报套接字,分别应用于网络的传输控制层中的TCP和UDP协议。