繁体   English   中英

Android ipc LocalSocket vs Binder(AIDL)

[英]Android ipc LocalSocket vs Binder (AIDL)

我希望每个应用程序都能够将数据发送到我的服务。 因此我需要进程间通信。 我能找到的每个页面都建议使用Messenger,AIDL或Intents(BroadcastReceiver)。 到目前为止,通过构建一些测试应用程序我可以弄清楚的是,如果while(true)循环内部发送多个线程,则BroadcastReceiver非常慢并且消息可能会丢失而不通知。 AIDL和Messenger不仅实现起来很复杂(需要服务,绑定器......),但是可以提供奇怪的行为,例如当使用AIDL发送多个线程导致RemoteException(!!! FAILED BINDER TRANSACTION !!!)时使用oneway关键字。 我想确保交货有保证。 有没有连理由使用oneway提货时应该得到保障?

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

使用LocalSocket时有任何缺点,因为android开发者页面说“有些应用尝试使用传统的Linux技术(如网络套接字和共享文件)实现IPC。我们强烈建议您使用IPC的Android系统功能”,但不会进一步评论就此而言

使用LocalSocket时是否有任何缺点

  1. LocalSocket在框架级别没有安全性。 虽然您可能“希望每个应用程序都能够将数据发送到我的服务”,但用户可能不会,这就是为什么标准IPC可以通过权限进行保护的原因。

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

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

活页夹:如果您不需要执行并发 IPC不同的应用程序 ,你应该创建通过实现你的界面Binder

信使:如果要执行IPC ,但并不需要处理多线程 ,实现用你的界面Messenger

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM