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

时间:2010-09-06 13:20:10

标签: android broadcastreceiver android-lifecycle

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

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

  • 在Manifest中注册:

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

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

感谢

3 个答案:

答案 0 :(得分:20)

你基本上是正确的。

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

答案 1 :(得分:4)

何时使用哪种方法注册

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

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

  2. 您的应用想要慷慨地对状态变化作出反应

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

    第二类的示例是指示应用可能依赖的环境变化的事件。假设您的应用取决于已建立的蓝牙连接。您必须对状态更改做出反应 - 但仅限于您的应用处于活动状态时。在这种情况下,不需要静态注册的广播接收器。动态注册的会更合理。

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

答案 2 :(得分:0)

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

另一个相关(且模糊)差异是某些特定系统Intents只会在以编程方式注册时触发您的接收器。仅会在清单中定义的接收器不会被调用。 例如:ACTION_SCREEN_ONACTION_SCREEN_OFFACTION_BATTERY_CHANGEDACTION_HEADSET_PLUG

我建议这个text提及有关意图和接收者的各种细节。