23

例如,我需要一个 BroadcastReceiver 来获取这些事件:

重启或关机

屏幕开启或关闭

电池状态(电压、插入、温度)

物理按钮按下(相机、媒体等)

但我需要 Listener 来获取这些事件:

用于传感器事件(加速度、磁场、方向、接近度、温度、光照水平等)的 EventListener

位置事件的 LocationListener(网络位置、GPS)

似乎接收器和侦听器都存在,以便我可以接收事件。除了明显的语义差异外,两者之间有什么区别?有没有我可以做的事情,但不能做其他事情,尤其是在屏幕关闭时我可以占用和运行多少 CPU?为什么有两种完全不同的构造用于接收事件?

4

4 回答 4

33

这两者之间有很多差异,他们对某事的反应是唯一的相似之处之一。

差异:

  • BroadcastReceivers 接收 Intent,而 Listener 基本上可以做任何事情,因为它没有明确的目的,它只是一个命名约定。例如,在开发网站上搜索“BroadcastReceiver”,然后搜索“Listener”

  • BroadcastReceivers 只接收一个非直接的 Intent Broadcast,Listeners 被显式调用。

  • BroadcastReceiver是它自己定义的类,因为它有明确的目的(接收 Intent),而 Listeners 可以是任何东西——它们通常是一个interface并且提供它们以便可以从一个类到另一个类进行回调。

  • 广播接收器通常用于全局、系统范围的事件,侦听器用于特定事件(即位置传感器不应该每秒更新位置,除非它有一些东西,例如要发布到的侦听器。与屏幕关闭意图相反 -这很重要,它会影响一切,因此应该向所有感兴趣的接收者广播)

  • BroadcastReceiver 拾取的事件通常是非连续事件(一次),而 Listener,取决于它们的工作,用于不断更新(连续)。

  • 如果在清单中声明了广播接收器,则系统可以对其进行实例化,侦听器仅是动态生成的(因此通过代码)。

  • CPU/Power 的使用取决于两者的实现,特别是如前所述,Listeners 可以是任何东西

有没有我可以做的事情,但不能做其他事情,尤其是在屏幕关闭时我可以占用和运行多少 CPU?

BroadcastReceivers 只有10 秒的保证执行时间。听众,因为他们不服务于特定目的,没有这个限制。

广播接收器绝对不能做的事情:

特别是,您可能不会在 BroadcastReceiver 中显示对话框或绑定到服务。

可能还有更多——这就是我想出的。

于 2013-02-10T04:33:58.873 回答
9

广播接收器就像西格玛,事件监听器就像数学中的积分都是求和......

  • Sigma:当我们需要在离散间井中求和时使用它......
  • Integral:当我们需要连续求和时使用它...

同样,Broad Cast Receiver 和 Event Listener 都用于事件侦听。但 Broad Cast 接收器用于侦听非常重要的事件,例如 BATTERY_CHANGED、BATTERY_LOW、BOOT_COMPLETED、CALL ETC 和事件列表器更新事件中的连续变化,例如 LOCATION CHANGED , 获得焦点等。

于 2013-07-15T10:43:53.007 回答
6

侦听器和接收器都充当触发器处理程序,但是,将它们分开的是这些触发器的起源和特征。

(广播)接收器由 Intent 触发。这些 Intent 的来源可能来自您自己的应用程序的上下文之外。因此,它是应用程序实现进程间通信的一种方式。

此外,应用程序无需运行即可接收 Intent。Intent 可以充当闹钟,在事件被触发时唤醒应用程序。这样可以节省电池和 CPU。

于 2013-02-10T05:30:16.140 回答
1

主要区别在于:

事件侦听器具有更连续的形式,即与传感器或按钮点击相关的事件更频繁。

但是接收器具有不连续的性质,即这里的事件不是连续的,例如,开机/关机、消息等

于 2013-02-10T04:56:40.167 回答