Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-04-04:请回答一下Android进程间的通信方式?

Moosphan opened this issue · comments

2019-04-04:请回答一下Android进程间的通信方式?

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

上面讲述的是RPC请把IPC解释一下

commented

我们android这边一般比较多的是AIDL, 当然还有其他比如 内容提供者,Socket, message, bundle 目前就想到这几种欢迎补充.

handlerMessage,broadcast,service,contentprovider,intent等方式都是可以的吧。。。

commented

使用Binder主要是通过绑定服务(bindService),服务端,主要是运行Service,客户端通过bindService获取到相关的Binder,Binder就作为桥梁进行跨进程的通信.然后通过handler进行接收消息不过messenger的话,服务端处理客户端的消息是川航的,得一个一个来。也就是说并发量大的时候messenger就不太合适了

aidl 广播等,跨进程原理是用binder机制,binder机制是一种cs架构的IPC通信方案,细节请大佬补充

commented

进程通讯,Android提供AIDL与Messenger,另外四大组件都支持进程通讯(机制都是Binder),Android进程通讯离不开Binder,另外非Android提供的有socket通讯,eventbus类库之类

可使用基于Binder的aidl,广播,provider等方式,也可使用socket,共享内存等linux自带方式

进程通讯,Android提供AIDL与Messenger,另外四大组件都支持进程通讯(机制都是Binder),Android进程通讯离不开Binder,另外非Android提供的有socket通讯,eventbus类库之类

eventbus 怎么实现的进程间通信呀。求指教

通信方式 优点 缺点 使用场景
Bundle 简单易用 只能传输Bundle支持的数据类型 四大组件间的进程间通信
文件共享 简单易用 不适合高并发场景,并且无法做到即时通信 无并发访问的情况,交换实时性不高的简单数据
Messenger 功能一般,支持一对多串行通信,支持实时通信 不能很好的处理高并发情况,不支持RPC,只能传输Bundle支持的数据类型 低并发的一对多即时通信,无RPC需求,或无须返回结果的RPC需求
AIDL 功能强大,支持一对多并发和实时通信 使用复杂,需要处理好线程同步问题 一对多通信且有RPC需求
ContentProvider 在数据源访问方面功能强大,支持一对多并发数据共享,可通过call方法扩展其他操作 可理解为受约束的AIDL,主要提供数据源的CRUD操作 一对多的进程间数据共享
Socket 功能强大,可通过网络传输字节流,支持一对多并发实时通信 实现细节较为烦琐,不支持直接RPC 网络数据交换

摘自Android开发艺术探索 - IPC 方式优缺点和使用场景

进程通讯,Android提供AIDL与Messenger,另外四大组件都支持进程通讯(机制都是Binder),Android进程通讯离不开Binder,另外非Android提供的有socket通讯,eventbus类库之类

eventbus 怎么实现的进程间通信呀。求指教

不能实现

通信方式 优点 缺点 使用场景
Bundle 简单易用 只能传输Bundle支持的数据类型 四大组件间的进程间通信
文件共享 简单易用 不适合高并发场景,并且无法做到即时通信 无并发访问的情况,交换实时性不高的简单数据
Messenger 功能一般,支持一对多串行通信,支持实时通信 不能很好的处理高并发情况,不支持RPC,只能传输Bundle支持的数据类型 低并发的一对多即时通信,无RPC需求,或无须返回结果的RPC需求
AIDL 功能强大,支持一对多并发和实时通信 使用复杂,需要处理好线程同步问题 一对多通信且有RPC需求
ContentProvider 在数据源访问方面功能强大,支持一对多并发数据共享,可通过call方法扩展其他操作 可理解为受约束的AIDL,主要提供数据源的CRUD操作 一对多的进程间数据共享
Socket 功能强大,可通过网络传输字节流,支持一对多并发实时通信 实现细节较为烦琐,不支持直接RPC 网络数据交换

摘自_Android开发艺术探索 - IPC 方式优缺点和使用场景_

广播 也可以做进程间通信

commented

从Linux系统上来说,有Socket、消息队列、管道、共享内存、Binder。理论上,这些都可以实现跨进程。

在Android的本地进程间通信,见识过两种:
1,基于binder,例如AIDL、广播、Intent等,这些内部实现都是通过Binder。Binder基于CS通信模式,通过mmap技术,单次拷贝实现的跨进程通信。
2,基于socket,例如:通知Zygote进程进行进程的孵化,就是通过socket通知过去的。

handlerMessage,broadcast,service,contentprovider,intent等方式都是可以的吧。。。

进程间通信 handler是处理不了的,另外几种无外乎基于binder的,在就是socket,文件流

Bundle :简单易用 只要用于四大组件间的进程通迅
文件:通过文件共享读写共享方式
Message
socket 使用网络字节流传输
ContentProvider内容提供者 进程间数据共享
AIDL 支持一对多实时通迅 大多数情况下使用AIDL做进程间通迅
AIDL通迅服务端实现 1,定义AIDL接口 2, 实现一个服务并重写onBind() 来返回Stub类的实现
AIDL通迅客户端实现 1,将.aidl文件复制到项目src /目录中 2,声明一个IBinder接口的实例 3,调用Context.bindService(),传入你的ServiceConnection实现 4,在onServiceConnected()实现中,将收到一个IBinder实例。 调用YourInterfaceName.Stub.asInterface((IBinder)service)将返回的参数强制转换为YourInterfaceName类型。5,YourInterfaceName调用提供方法

1、管道
2、共享内存
3、socket
4、binder
5、信号量
等等