安卓操作系统中有哪些IPC机制可用?

76

请问有哪些在安卓系统中存在的进程间通信(IPC)机制?

据我所知包括:

  1. 意图(Intents)
  2. 绑定器(Binders)
7个回答

102

IPC是进程间通信的缩写。它描述了不同类型的Android组件之间进行通信所使用的机制。

1)Intents是组件可以发送和接收的消息。这是一种在进程之间传递数据的通用机制。通过意图,可以启动服务或活动、调用广播接收器等。

2)Bundles是传输数据的实体。它类似于对象的序列化,在Android上速度更快。可以通过getExtras()方法从意图中读取Bundle。

3)Binders是允许活动和服务获取对另一个服务的引用的实体。它不仅允许向服务发送消息,还允许直接调用它们的方法。


这个通用机制是通过什么方式实现的呢?(期望得到类似于内核系统调用、Dalvik中找到的Java扩展等内容) - n611x007
8
Bundle可以被视为随着Intent而来,不要忘记BroadcastReceiver。以下是来自Android官方页面的话语:“我们强烈建议您改用Android系统功能进行IPC,例如使用带有Service的Intent、Binder或Messenger和BroadcastReceiver。”http://developer.android.com/training/articles/security-tips.html#IPC - Sam003
1
有人可以添加示例吗?如果每种IPC类型都有用例,新手将更快地理解它。 - guettli
不同类型的Android组件。 - Yousha Aleayoub
“binder” 实际上不是 Android 中所有提到的机制的基础吗?我们知道,Android Binder 框架为 IPC 提供了内核能力。 - ctk2021

44

Android 中有三种 IPC 机制:

  1. Intents(以及 Bundles)
  2. Binders
  3. ASHMEM(匿名共享内存)- Linux 共享内存和此共享内存的主要区别在于,在 Linux 中,其他进程无法释放共享内存,但在这里,如果其他进程需要内存,则 Android OS 可以释放此内存。

1
这里没有 AIDL 吗? - Raa
6
绑定器包括AIDL。它只是一种语言,帮助您为IPC生成绑定器接口。 - sweisgerber.dev
只有在你知道自己在做什么的情况下才使用ASHMEM。不保证不同Android版本之间的兼容性。 - David Burström
4
应该添加UNIX套接字和管道。 - aberaud
内容提供者和广播呢? - Mit_

24
这篇文章中所有回答都非常好且简洁。但我想强调一下我们应该使用哪种IPC机制。首先,IPC表示进程间通信,即两个应用程序或进程之间通过传递一些数据来进行通信。由于Android是针对嵌入式和小型设备的,因此我们不应该使用序列化来进行IPC,而应该使用内部使用parcelBINDERsParcel是一种利用共享内存概念的轻量级序列化方式。 Binder IPC与序列化IPC之间存在许多差异: 1. 在嵌入式设备中使用序列化非常耗费资源,通讯速度会很慢。

2. Binders 使用 Parcels 来使IPC非常快速。

3. Binder 内部使用的共享内存概念在两个进程之间共享数据时使用较少的内存。 底线: Binders 使用的内存较少,而且由于使用了 parcels,所以速度相当快。而序列化非常耗费资源,发送和接收数据需要时间,而且与 binders 相比,序列化需要更多的内存。 注意: 为了在活动、服务和接收器之间传递数据,请仅使用Bundles。不要选择序列化或 binders。Binders 专门用于 binder 服务,两个进程将进行通信。
希望这有所帮助 :)

22

Android开发者页面上所述,Android中的IPC机制包括:

  • 意图(包括捆绑包)
  • 使用服务的绑定器或信使
  • 广播接收器

1
所有这些都基于 Binder IPC。 - Xiao-Feng Li

6

IPC机制有三种类型:

  1. 处理程序
  2. 实现绑定器
  3. AIDL

1
处理程序不是。Messenger 是。 - John

1

在Android中,树形特定的进程间通信方式有如下几种:

  1. AIDL:双向并发操作
  2. Messanger:双向但非并发
  3. Broadcast:单向 此外,您也可以使用套接字,但不建议这样做。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接