BroadcastReceiver的清单和编程注册的主要区别

我想了解在清单中注册BroadcastReceiver和以编程方式注册它之间的主要区别…

我的理解基本上如下(如果我失去了一些东西,会感谢有人纠正我的观点)。

  • 在清单中注册:

    1. 如果需要的话,操作系统会神奇地发现并实例化你的类,调用onReceive()方法,无论你的应用程序的运行状态是什么
    2. 你的接收只会被调用一次广播(即你可以认为,在清单注册就像注册您的'类'接收广播 – 广播实例化你的类根据需要)(??)
  • 以编程方式注册:

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

谢谢

Solutions Collecting From Web of "BroadcastReceiver的清单和编程注册的主要区别"

你有它基本上是正确的。

请注意,清单注册的接收方对象只能使用一次。 为每个广播创build一个新的BroadcastReceiver实例。 清单注册接收机的主要用途是在代码不在内存中的情况下进行广播(例如, BOOT_COMPLETED ,通过AlarmManager的预定警报)。

何时使用哪种方法进行注册

使用哪种方法注册您的BroadcastReceiver取决于您的应用程序如何处理系统事件。 我认为基本上有两个原因,为什么你的应用程序想知道系统级事件:

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

  2. 你的应用程序要慷慨反应,以改变状态

第一类的例子是一旦设备启动就需要工作的应用程序,或者安装应用程序时必须启动某种工作的应用程序。 电池Widget Pro或App2SD是这些types的应用程序很好的例子。 对于这种types,您必须在清单文件中注册BroadcastReceiver。

第二类的例子是指示你的应用程序可能依赖的情况发生变化的事件。 说你的应用程序依赖于build立的蓝牙连接。 您必须对状态更改做出反应 – 但只能在您的应用程序处于活动状态时进行。 在这种情况下,不需要静态注册的广播接收机。 dynamic注册的会更合理。

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

我的理解是正确的。

另一个相关的(和模糊的)区别是,一些特定的系统意图只会通过程序注册来触发你的接收器。 只在清单中定义的接收者不会被调用。 示例如下: ACTION_SCREEN_ON , ACTION_SCREEN_OFF , ACTION_BATTERY_CHANGED , ACTION_HEADSET_PLUG

我build议这个文本提到关于意图和接收器的各种细节。