Android IPC的LocalSocket和Binder(AIDL)有何区别?

7
我希望每个应用都能向我的服务发送数据。因此,我需要进程间通信。我能找到的每个页面都建议使用Messenger、AIDL或Intents(BroadcastReceiver)。到目前为止,通过构建一些测试应用程序,我发现BroadcastReceiver非常慢,并且在while(true)循环中使用多个线程发送消息时可能会丢失消息而没有通知。而AIDL和Messenger不仅实现复杂(需要服务、绑定器等),而且可能会提供奇怪的行为,例如使用oneway关键字时,在使用AIDL时会发生RemoteException(!!!FAILED BINDER TRANSACTION !!!)甚至只是在使用多个线程发送时也会发生异常。我想确保交付是有保障的。当想要确保交付时,是否有使用oneway的原因呢?
然而,LocalSocket似乎非常容易使用(不需要服务,就像Java套接字一样工作)。客户端应用程序可以打开LocalSocket,连接到提供的地址,然后while(true) outputstream.writeObject(); 使用LocalSocket是否存在任何缺点呢?因为Android开发者页面说:“一些应用程序尝试使用传统的Linux技术,如网络套接字和共享文件来实现IPC。我们强烈建议您改用Android系统功能进行IPC”,但并未进一步说明。
2个回答

5
使用LocalSocket有哪些缺点?
  1. LocalSocket 框架层面上不存在安全性。尽管你可能 "希望每个应用都能向我的服务发送数据",但用户可能不希望这样,这就是为什么标准 IPC 可以通过权限来保护。

  2. startService()bindService() 将导致创建一个服务实例,甚至在需要处理请求时启动进程。因此,你无论如何都需要使用 startService()bindService()


1

AIDL: 只有当您允许来自不同应用程序的客户端访问您的服务以进行IPC并且希望在服务中处理多线程时,才需要使用AIDL

Binder: 如果您不需要在不同应用程序之间执行并发IPC,则应通过实现Binder创建您的接口。

Messenger: 如果您想要执行IPC,但不需要处理多线程,请使用Messenger实现您的接口。


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