AIDL vs Messenger

问题描述 投票:7回答:4

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

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

android multithreading aidl
4个回答
3
投票

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


10
投票

每个Android文档:

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

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

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

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

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

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

如果有人能够权衡我的决定,我们将不胜感激。


1
投票

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

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


1
投票

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

AIDL或Messenger,AIDL是最好的,它让我可以自由地同步和异步调用。

信使:

  • 异步通信。
  • 对可以通过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允许开发人员将其接口公开给其他应用程序。客户和服务都同意,以便彼此通信。
© www.soinside.com 2019 - 2024. All rights reserved.