Android IPC LocalSocket 与活页夹 (AIDL)

Android ipc LocalSocket vs Binder (AIDL)

我希望每个应用都能向我的服务发送数据。因此我需要进程间通信。我能找到的每个页面都建议使用 Messenger、AIDL 或 Intents (BroadcastReceiver)。到目前为止,我可以通过构建一些测试应用程序发现 BroadcastReceiver 非常慢,如果在 while(true) 循环中使用多个线程发送消息,消息可能会在没有通知的情况下丢失。 AIDL 和 Messenger 不仅实现起来很复杂(需要服务,活页夹,......)而且可以提供奇怪的行为,例如当使用 AIDL 发送多线程导致 RemoteException(!!! FAILED BINDER TRANSACTION !!! )时使用 oneway 关键字。我想确保交货有保证。在应该保证交付时甚至有理由使用 oneway 吗?

尽管如此,LocalSocket 似乎非常易于使用(不需要服务,就像 java 套接字一样工作)。客户端应用程序可以只打开一个 LocalSocket,连接到提供的地址,然后 while(true) outputstream.writeObject();

使用 LocalSocket 时是否有任何缺点,因为 android 开发者页面说 "Some apps attempt to implement IPC using traditional Linux techniques such as network sockets and shared files. We strongly encourage you to instead use Android system functionality for IPC" 但没有对此做进一步评论

Are there any downsides when using LocalSocket

  1. LocalSocket 的框架级别没有安全性。虽然你可能 "want every app to be able to send data to my service",但 用户 可能不会,这就是标准 IPC 可以受权限保护的原因。

  2. startService()bindService() 将创建您的服务实例,如果需要处理请求,甚至会为您启动一个进程。您的服务不会一直 运行。所以,无论如何你都需要 startService()bindService()

AIDL:仅当您允许来自不同应用程序的客户端访问您的服务IPC并希望处理[=22]时才需要使用AIDL =]多线程在你的服务中。

Binder:如果你这样做不需要需要在不同的应用程序[=]中执行并发IPC 29=],你应该通过实现一个Binder来创建你的界面。

Messenger:如果您想执行IPC,但不需要需要处理多线程,请使用一个Messenger