Android ipc LocalSocket vs Binder(AIDL)

问题描述 投票:3回答:2

我希望每个应用程序都能够将数据发送到我的服务。因此我需要进程间通信。我能找到的每个页面都建议使用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系统功能”,但不会进一步评论就此而言

android multithreading ipc aidl android-binder
2个回答
3
投票

使用LocalSocket时是否有任何缺点

  1. LocalSocket在框架级别没有安全性。虽然您可能“希望每个应用程序都能够将数据发送到我的服务”,但用户可能不会,这就是为什么标准IPC可以通过权限进行保护的原因。
  2. 如果需要处理请求,startService()bindService()将导致创建服务实例,甚至为您启动进程。您的服务不会一直运行。所以,无论如何你需要startService()bindService()

0
投票

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

Binder:如果你不需要在不同的应用程序中执行并发IPC,你应该通过实现Binder来创建你的界面。

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

© www.soinside.com 2019 - 2024. All rights reserved.