广播接收器,AIDL和Messenger有什么区别?

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

有人可以区分使用广播接收器,AIDL(Android接口定义语言)和信使的场景吗?我被告知使用广播接收器是电池耗尽所以我不应该使用它。 AIDL和信使用于IPC(进程间通信),但我可以使用AIDL方式将数据从服务传递到同一进程中的活动。

那么在那种情况下,我应该更喜欢AIDL还是广播接收器?

android service broadcastreceiver aidl
3个回答
3
投票

================更新2015年1月24日==================== 要了解Messenger和AIDL机制之间的区别,as per documentation

使用Messenger 如果您需要您的界面跨不同的进程工作,您可以使用Messenger为服务创建一个界面。通过这种方式,服务定义了一个响应不同类型的Message对象的Handler。此Handler是Messenger的基础,然后可以与客户端共享IBinder,允许客户端使用Message对象向服务发送命令。此外,客户端可以定义自己的Messenger,以便服务可以发回消息。这是执行进程间通信(IPC)的最简单方法,因为Messenger将所有请求排队到一个线程中,这样您就不必将服务设计为线程安全的。

使用AIDL AIDL(Android界面定义语言)执行所有工作,将对象分解为操作系统可以理解的基元,并跨进程执行IPC以执行IPC。使用Messenger的先前技术实际上是基于AIDL作为其底层结构。如上所述,Messenger在单个线程中创建所有客户端请求的队列,因此服务一次接收一个请求。但是,如果您希望服务同时处理多个请求,则可以直接使用AIDL。在这种情况下,您的服务必须能够进行多线程并且构建为线程安全的。要直接使用AIDL,必须创建一个定义编程接口的.aidl文件。 Android SDK工具使用此文件生成一个抽象类,该类实现接口并处理IPC,然后您可以在服务中进行扩展。

除了文档所说的内容之外,AIDL实现还包括编写样板代码,用于编组和解组传输的数据(使用Parcelable接口),能够一次接收来自多个线程的请求,而Messenger将消息排队并执行繁重的工作,但在一个时间的要求。


对于Service-Activity交互,您应该使用异步回调机制。使用EventBus库,解决方法非常简单。它基本上使用广播接收器进行消息调度以及应用程序的不同组件之间的通信。 我强烈建议你看看this tutorial和链接,因为EventBus现在是android开发中使用最频繁的库。


1
投票

广播接收器

  • 这是一种异步通信。
  • 复杂性很低 - 这是在流程之间进行通信的最简单方法。
  • 一对一通信 - 广播正在同时向所有收件人传送消息。
  • 基于Android OS意图的应用程序组件之间的通信
  • BroadcastReceiver.onReceive总是在主线程(UI线程)中运行
  • 通过intent发送数据时,应小心将数据大小限制为几KB。发送过多数据可能导致系统抛出TransactionTooLargeException异常。 https://developer.android.com/guide/components/activities/parcelables-and-bundles
  • Intents可以传输高达1Mb数据的语句肯定是错误的,500Kb更准确。 https://www.neotechsoftware.com/blog/android-intent-size-limit
  • 安全性:广播通过Android操作系统传输,可能会带来安全威胁。其他应用可以收听广播。不应广播任何敏感数据。

信使:

  • 异步通信。
  • 对可以通过Intent发送到远程进程的Handler的引用。
  • 复杂性是中等的。
  • 远程进程通过messenger发送的消息将传递给本地处理程序。
  • 使用Messenger时,它会创建服务一次收到一个客户端请求的所有客户端请求的队列。所有这些都发生在一个线程上。
  • 如果您希望您的服务同时处理多个请求,那么您需要直接使用AIDL并确保您的服务能够进行多线程并确保线程安全。

参考:http://codetheory.in/android-interprocess-communication-ipc-messenger-remote-bound-services/ https://www.slideshare.net/yoni1984/ipc-aidl-sexy-not-a-curse

AIDL:

  • 它是同步和异步进程间通信。默认情况下,AIDL通信是同步的。为了使AIDL通信异步,请使用“oneway”关键字。
  • 复杂性很高 - AIDL接口向服务发送同步请求,该服务必须处理多线程。
  • 一对一的沟通
  • 使用底层的Android OS Binder框架
  • 需要编写线程安全的代码。
  • Binder事务缓冲区具有有限的固定大小,当前为1Mb,由进程正在进行的所有事务共享。 https://developer.android.com/reference/android/os/TransactionTooLargeException.html
  • 安全性:AIDL允许开发人员将其接口公开给其他应用程序。客户和服务都同意,以便彼此通信。

-3
投票

我推荐广播接收器。请查看j2emanue https://stackoverflow.com/a/22567356/5682331的回答