AIDL与Messenger的区别

9
需求: 需要将来自不同进程的服务/合同暴露给其他应用程序。例如:getPhoneRecord(recordId),deletePhoneRecord(phoneId)等。
潜在解决方案: Messenger或AIDL。

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


自定义广播通信怎么样?双向通信应该是可行的。 - Duna
5个回答

12

根据Android文档:

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

我只想确定AIDL是否是我最好的选择。因此,我总结了在Android中实现后台服务的以下内容:

广义而言,Android中的服务可以是启动绑定

启动的服务给定启动的服务仅执行单个操作并且不向调用者返回结果,因此无法满足我的特定要求(从不同进程向其他应用公开服务/合同。例如:getPhoneRecord(recordId),deletePhoneRecord(phoneId)等)

绑定服务有三种不同的风味

  1. 扩展Binder类-仅用于私有服务,在应用程序内运行。不能跨进程边界。因此,我也不能使用它。
  2. 使用Messenger-提供一种非常通用的方法,可在应用程序之间发送消息。 Messenger仅限于在客户端上发送(Message)和服务器上的handleMessage(Message msg)。
  3. 使用AIDL-获胜者!

如果有人能就我的决定发表意见,将不胜感激。


我现在正在做同样的决定。Messenger 给我的工作量较少,但是 AIDL 可以给我一个更好的 API。无论使用哪种方式,合同仍然必须以 AIDL 文件的形式或者消息 ID / 数据在 Bundle 中的形式(如果使用 Messenger)给出。 - Boy

5

是的,您的理解是正确的。无论哪种情况,您都必须清楚地定义API。如果使用Messenger,则只是异步的自定义消息,因此,如果您的服务需要发送数据回来,则还需要在客户端上具有某种类似的机制。使用AIDL和绑定器更符合您所描述的想要做的事情。


4

在我们的项目中选择IPC通信机制时,我总结了一些要点,这可能对某些人有帮助。

AIDL或Messenger,AIDL是最好的选择,因为它可以让我自由地进行同步和异步调用。

Messenger:

  • 异步通信。

  • 可以通过Intent将Handler的引用发送到远程进程。

  • 复杂度中等。

  • 由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通信,使用“oneway”关键字。

  • 复杂度高——AIDL接口发送多个并发请求给服务端,因此服务端必须处理多线程。

  • 一对一通信

  • 使用底层的Android OS Binder框架

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

  • Binder事务缓冲区有一个固定的、有限的大小,目前为1Mb,所有正在进行中的事务共享它。https://developer.android.com/reference/android/os/TransactionTooLargeException.html"

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


2

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

1)在客户端(活动)中创建Messenger。 2)使用Messenger作为参数启动服务时,在服务器端(服务)上传递Messenger。 3)使用Messenger将消息从服务器发送到客户端。


0
作为简短的回答: AIDL 是一种具有并发操作的双向进程间通信。 但是,Messager 只是一个在 Binder 下面的双向方法包装器。

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