22

我试图了解在 Manifest 中注册 BroadcastReceiver 和以编程方式注册之间的主要区别......

我的理解基本上如下(如果我遗漏了什么,将不胜感激有人纠正我的观点)。

  • 在清单中注册:

    1. 如果需要,操作系统会神奇地找到并实例化你的类,调用 onReceive() 方法,不管你的应用程序的运行状态是什么
    2. 您的接收只会在每个广播中被调用一次(即您可以认为在清单中注册就像注册您的“类”以接收广播 - 并且广播会根据需要实例化您的类)(??)
  • 以编程方式注册:

    1. 在代码中注册意味着您正在注册您的类的实例以接收广播消息(即,如果您的代码有点草率,并且您设法注册了多次,您最终会得到多个 BroadcastReceiver 实例,它们都调用了 onReceive()广播
    2. 要注销,您需要注销您之前注册的特定 BroadcastReceiver 实例
    3. 如果您的应用程序被操作系统破坏,您的 onReceive() 方法将不会被调用以进行广播

谢谢

4

3 回答 3

21

你说的基本正确。

请注意,清单注册的接收器对象仅使用一次。BroadcastReceiver每次广播都会创建一个您的新实例。清单注册接收器的主要用途是当您的代码不在内存中时可能会继续广播(例如BOOT_COMPLETED,您的计划警报通过AlarmManager)。

于 2010-09-06T14:04:25.883 回答
5

何时使用哪种方法注册

使用哪种方法注册 BroadcastReceiver 取决于您的应用程序对系统事件的处理方式。我认为您的应用想要了解系统范围的事件基本上有两个原因:

  1. 您的应用围绕这些事件提供某种服务

  2. 你的应用想要对状态变化做出优雅的反应

第一类的示例是需要在设备启动后立即运行的应用程序,或者在安装应用程序时必须开始某种工作的应用程序。Battery Widget Pro 或 App2SD 是这类应用程序的好例子。对于这种类型,您必须在 Manifest 文件中注册 BroadcastReceiver。

第二类的示例是表明您的应用程序可能依赖的环境发生变化的事件。假设您的应用程序依赖于已建立的蓝牙连接。你必须对状态变化做出反应——但只有当你的应用程序处于活动状态时。在这种情况下,不需要静态注册的广播接收器。动态注册的会更合理。

还有一些事件甚至不允许您静态注册。一个例子是每分钟广播一次的 Intent.ACTION_TIME_TICK 事件。这是一个明智的决定,因为静态接收器会不必要地耗尽电池电量。

于 2013-12-12T05:23:30.047 回答
0

根据我的理解,您的理解是正确的。

另一个相关(和晦涩)的区别是,某些特定的系统 Intent 仅在以编程方式注册时才会触发您的接收器。仅在清单中定义的接收器不会被调用。例如:ACTION_SCREEN_ONACTION_SCREEN_OFFACTION_BATTERY_CHANGEDACTION_HEADSET_PLUG

我推荐这篇文章,其中提到了有关 Intents 和 Receivers 的各种细节。

于 2013-11-27T18:47:48.143 回答