BroadcastReceiver的Manifest和Programmatic注册之间的主要区别

rwm*_*rwm 19 android broadcastreceiver android-lifecycle

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

我的理解基本如下(如果我遗漏了某些东西,我会感谢有人纠正我的观点).

  • 在Manifest中注册:

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

    1. 在代码中注册意味着您正在注册您的类的实例以接收广播消息(即,如果您的代码有点草率,并且您设法多次注册,则最终会有多个BroadcastReceiver实例都调用其onReceive()广播
    2. 要取消注册,您需要取消注册先前注册的特定BroadcastReceiver实例
    3. 如果您的应用程序被操作系统销毁,则不会为广播调用onReceive()方法

谢谢

Com*_*are 20

你有它基本上是正确的.

请注意,清单注册的接收器对象仅使用一次.BroadcastReceiver为每个广播创建了一个新的实例.清单注册接收器的主要用途是用于在代码不在内存中时可能继续进行的广播(例如,BOOT_COMPLETED通过您的预定警报AlarmManager).

  • @BehzadBahmanyar:不.这意味着Android本身维护着一个已注册接收器的目录.当清单注册的接收器遇到匹配的广播时,如果没有进程已经运行,Android将为您启动一个进程. (3认同)

Sun*_*hoo 5

何时使用哪种方法注册

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

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

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

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

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

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