AIDL vs Messenger

时间:2014-08-10 22:43:10

标签: android multithreading aidl

要求:需要将服务/合同从其他流程公开给其他应用。例如:getPhoneRecord(recordId),deletePhoneRecord(phoneId)等 潜在解决方案:Messenger或AIDL

根据我的分析,我认为AIDL是唯一的选择,因为Messenger提供了一种非常通用的跨应用程序发送消息的方式。 Messenger仅限于在客户端发送(Message)和在服务器上发送handleMessage(Message msg)。还存在其他差异,例如多线程。但是,我关心的是从其他应用程序/消费者可以调用的服务定义API契约。我的理解是否正确?

4 个答案:

答案 0 :(得分:10)

根据Android文档:

  

大多数应用程序不应使用AIDL来创建绑定服务,   因为它可能需要多线程功能并且可能导致a   更复杂的实施。

我只是想确保我确信AIDL是我最好的朋友。所以,我想出了以下在Android中实现后台服务的总结:

从广义上讲,Android中的服务可以启动绑定

已启动服务 鉴于已启动的服务执行单个操作并且未将结果返回给调用者,因此它无法满足我的特定要求(将服务/合同从其他进程暴露给其他应用程序。例如:getPhoneRecord(recordId), deletePhoneRecord(phoneId)等。)

约束服务 有三种不同的口味

  1. 扩展Binder类 - 仅用于私有服务,在应用程序内运行。无法跨越流程边界。所以我也不能用它。
  2. 使用Messenger-提供跨应用程序发送消息的非常通用的方式。 Messenger仅限于在客户端发送(Message)和在服务器上发送handleMessage(Message msg)。
  3. 使用AIDL-获胜者!
  4. 如果有人能够权衡我的决定,我们将不胜感激。

答案 1 :(得分:3)

是的,您的理解是正确的。在任何一种情况下,您都必须明确定义您的API。如果使用Messenger,它只是异步的自定义消息,因此如果您需要服务发回数据,那么客户端也需要某种类似的机制。使用AIDL和活页夹更符合您的描述。

答案 2 :(得分:1)

第二点: 信使可用于从服务器向客户端发送消息。

1)在客户端创建一个信使(活动) 2)当使用messenger作为参数的startService时,将messenger传递给服务器端(服务)。 3)使用信使将消息从服​​务器发送到客户端。

答案 3 :(得分:1)

在我必须为我们的项目中的IPC选择一种通信机制时,请注意我收集的观点。可能对某人有帮助。

AIDL或Messenger,AIDL是最好的,它使我可以自由同步和异步呼叫。

信使:

  • 异步通信。

  • 对处理程序的引用,可以通过Intent将其发送到远程进程。

  • 复杂程度中等。

  • 由远程进程通过Messenger发送的消息将传递到本地处理程序。

  • 使用Messenger时,它将创建一个队列,其中包含该服务一次接收到的所有客户端请求。所有这些都发生在单个线程上。

  • 如果您希望您的服务同时处理多个请求,则需要直接使用AIDL,并确保您的服务具有多线程功能,并确保线程安全。

参考:http://codetheory.in/android-interprocess-communication-ipc-messenger-remote-bound-services/ https://www.slideshare.net/yoni1984/ipc-aidl-sexy-not-a-curse

AIDL:

  • 这是同步和异步进程间通信。默认情况下,AIDL通信是同步的。为了使AIDL通信异步,请使用“单向”关键字。

  • 复杂度很高-AIDL接口将同时请求发送到服务,该请求必须处理多线程。

  • 一对一通信

  • 使用基础的Android OS Binder框架

  • 需要编写线程安全代码。

  • Binder事务缓冲区具有有限的固定大小,当前为1Mb,该进程的所有正在进行的事务共享该大小。 https://developer.android.com/reference/android/os/TransactionTooLargeException.html

  • 安全性:AIDL允许开发人员将其接口暴露给其他应用程序。客户端和服务双方都同意,以便彼此通信。