要求:需要将服务/合同从其他流程公开给其他应用。例如:getPhoneRecord(recordId),deletePhoneRecord(phoneId)等 潜在解决方案:Messenger或AIDL
根据我的分析,我认为AIDL是唯一的选择,因为Messenger提供了一种非常通用的跨应用程序发送消息的方式。 Messenger仅限于在客户端发送(Message)和在服务器上发送handleMessage(Message msg)。还存在其他差异,例如多线程。但是,我关心的是从其他应用程序/消费者可以调用的服务定义API契约。我的理解是否正确?
答案 0 :(得分:10)
根据Android文档:
大多数应用程序不应使用AIDL来创建绑定服务, 因为它可能需要多线程功能并且可能导致a 更复杂的实施。
我只是想确保我确信AIDL是我最好的朋友。所以,我想出了以下在Android中实现后台服务的总结:
从广义上讲,Android中的服务可以启动或绑定
已启动服务 鉴于已启动的服务执行单个操作并且未将结果返回给调用者,因此它无法满足我的特定要求(将服务/合同从其他进程暴露给其他应用程序。例如:getPhoneRecord(recordId), deletePhoneRecord(phoneId)等。)
约束服务 有三种不同的口味
如果有人能够权衡我的决定,我们将不胜感激。
答案 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允许开发人员将其接口暴露给其他应用程序。客户端和服务双方都同意,以便彼此通信。