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

重新启动或关机

屏幕开或关

电池状态(电压,接通电源,温度)

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

但是我需要监听器来获取以下事件:

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

用于位置事件的LocationListener(网络位置,GPS)

似乎接收方和监听方都存在,以便我可以接收事件。除了明显的语义差异之外,两者之间还有什么区别?我可以在其中一项上做其他事情,而不能在另一项上做,尤其是在屏幕关闭时我可以占用并运行多少CPU方面?为什么出于接收事件的目的有两种完全不同的构造?

最佳答案

两者之间的差异如此之多,它们对某些事物的回应是唯一的相似之处之一。

差异:

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

BroadcastReceivers刚收到一个非直接的Intent Broadcast,监听器被显式调用。

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

BroadcastReceivers通常用于全局的系统范围的事件,特定事件的监听器(即,位置传感器除非有某些东西(例如要向其发布的监听器),否则不应该每秒发送一次位置更新。 -这很重要,它影响到一切,因此应广播给所有感兴趣的接收者。

事件BroadcastReceiver接收的事件通常是非连续事件(一次触发),而监听器(取决于它们的工作)可以将用于持续更新(连续)。 如果在 list 中声明了

BroadcastReceivers,则系统可以将其实例化。仅动态创建监听器(因此通过代码)。

CPU/功耗的使用取决于两者的实现,尤其是因为如上所述,监听器可以是或。

Are there things I can do in one but not the other, especially in regards to things like how much CPU I can take and running while the screen is off?

BroadcastReceivers仅具有10 seconds of guaranteed execution time。监听器没有特定的用途,因此没有此限制。

您肯定无法从BroadcastReceiver做的事情:

In particular, you may not show a dialog or bind to a service from

within a BroadcastReceiver.

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