Android广播接收器 vs AIDL

8
使用AIDL和广播接收器在应用程序之间发送消息的优缺点是什么(针对后台和前台处理)?我一直在使用接收器,由于具有意图过滤器的订阅模型以及易于使用/可扩展性,这很好。使用此方法与AIDL相比有什么缺点吗?
谢谢 Ben

1
其实我也有同样的问题。 - Tirtha
我们决定采用广播接收器,并且从未后悔过这个决定。对于处理事件来说,这是最好的选择,非常适合发布/订阅模式。我们还使用内容提供者来查询数据... - Ben
3个回答

1

广播接收器

  • 这是一种异步通信。
  • 复杂度低 - 这是进程之间通信最简单的方式。
  • 一对多通信 - 广播是将消息同时传递给所有接收者的。
  • Android操作系统基于意图的应用程序组件之间的通信
  • BroadcastReceiver.onReceive始终在主线程(UI线程)中运行。
  • 通过意图发送数据时,应小心限制数据大小为几KB。发送过多的数据可能会导致系统抛出TransactionTooLargeException异常。 https://developer.android.com/guide/components/activities/parcelables-and-bundles

    关于Intent可以传输高达1MB的数据的说法是绝对错误的,500KB更加准确。 https://www.neotechsoftware.com/blog/android-intent-size-limit"

  • 安全性:广播通过Android操作系统传输,这可能会引入安全威胁。其他应用程序可以监听广播。不应广播任何敏感数据。

AIDL

  • 它是一个同步和异步的进程间通信方式。默认情况下,AIDL通信是同步的。为了使AIDL通信异步化,请使用“oneway”关键字。

  • 复杂性较高 - AIDL接口向服务发送同时请求,服务必须处理多线程。

  • 一对一通信

  • 使用基础Android操作系统的Binder框架

  • 需要编写线程安全代码。

  • Binder事务缓冲区具有有限的固定大小,目前为1Mb,该大小由进程中所有正在进行的事务共享。 https://developer.android.com/reference/android/os/TransactionTooLargeException.html"

  • 安全性:AIDL允许开发人员将其接口公开给其他应用程序。客户端和服务端都必须同意才能彼此通信


0

AIDL

常见用途:

  • 允许应用程序作为服务器,为一个或多个客户端-应用程序提供服务。

缺点:

  • 相对于广播,其实现更加复杂。
  • 需要处理多线程,因为服务同时接收请求。

广播

常见用途:

  • 允许应用程序向一个或多个应用程序(监听器)发送有关应用程序中发生的有趣事件的广播。

总之:

由于并非一刀切的情况,每种方法都有其更好的使用场景。

  • 例如,在以下情况下使用AIDL更有效率:

    – 需要一个服务器同时为多个客户端提供服务

    – 客户端不仅需要向服务器发送请求,还需要消耗返回的响应。

  • 另一方面,在以下情况下使用广播更有效率:

    – 主题需要通知观察者有趣的事件(不经常发生)[与轮询模式不同]。

    – 一个应用程序需要通知另一个应用程序某些内容,并且不消耗返回的响应。

这两种方法都可以使用相同的方式进行安全保护,即自定义Android权限。这样只允许使用相同密钥签名的应用程序共享通信。


0

我认为一个缺点可能是电池寿命,因为持续监听接收器会对电池电量造成压力。如果在广播时不强调权限,BroadCastReceivers可能存在安全漏洞,除非你只在本地广播,那么当然可以使用LocalBroadcastManager。

对我来说,AIDL似乎更安全,但更难以抽象化以便在团队中进行通用使用。当我想在另一个进程中进行许多不同的API调用时,我喜欢使用AIDL文件。就像一个遥控器一样。使用Broadcastreciever可能更难直接调用自定义方法来执行工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接