【问题标题】:Android ipc LocalSocket vs Binder (AIDL)Android ipc LocalSocket 与 Binder (AIDL)
【发布时间】:2016-11-02 15:57:24
【问题描述】:

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

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

使用 LocalSocket 时是否有任何缺点,因为 android 开发者页面显示“某些应用程序尝试使用传统的 Linux 技术(例如网络套接字和共享文件)来实现 IPC。我们强烈建议您改用 Android 系统功能来实现 IPC”,但确实如此对此不做进一步评论

【问题讨论】:

    标签: android multithreading ipc aidl android-binder


    【解决方案1】:

    使用LocalSocket有什么缺点

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-20
        • 2016-02-12
        • 2013-01-16
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        相关资源
        最近更新 更多