Android-Daily-Interview icon indicating copy to clipboard operation
Android-Daily-Interview copied to clipboard

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

Open Moosphan opened this issue 5 years ago • 18 comments

Moosphan avatar Apr 04 '19 01:04 Moosphan

image

ADrunkenLiBai avatar Apr 04 '19 01:04 ADrunkenLiBai

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

ADrunkenLiBai avatar Apr 04 '19 01:04 ADrunkenLiBai

image

ADrunkenLiBai avatar Apr 04 '19 01:04 ADrunkenLiBai

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

ADrunkenLiBai avatar Apr 04 '19 01:04 ADrunkenLiBai

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

leon5458 avatar Apr 04 '19 01:04 leon5458

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

xda1212 avatar Apr 04 '19 01:04 xda1212

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

Ssuiyingsen avatar Apr 04 '19 01:04 Ssuiyingsen

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

manondidi avatar Apr 04 '19 03:04 manondidi

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

mosentest avatar Apr 07 '19 07:04 mosentest

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

canyie avatar Apr 07 '19 13:04 canyie

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

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

hgwxr avatar Apr 15 '19 01:04 hgwxr

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

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

Moosphan avatar Apr 15 '19 02:04 Moosphan

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

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

不能实现

JasonLeeYing avatar Apr 22 '19 02:04 JasonLeeYing

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

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

广播 也可以做进程间通信

sunzhibindev avatar Aug 08 '19 01:08 sunzhibindev

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

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

yline avatar Dec 19 '19 09:12 yline

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

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

ddong1031 avatar Mar 12 '20 07:03 ddong1031

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调用提供方法

mlinqirong avatar Dec 27 '21 10:12 mlinqirong

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

xiaanming avatar May 18 '23 08:05 xiaanming