我试图理解在Manifest中注册BroadcastReceiver和以编程方式注册它之间的主要区别......
我的理解基本如下(如果我遗漏了某些内容,我会感谢有人纠正我的观点)。
在Manifest中注册:
以编程方式注册:
感谢
答案 0 :(得分:20)
你基本上是正确的。
请注意,清单注册的接收器对象仅使用一次。为每个广播创建了BroadcastReceiver
的新实例。清单注册接收器的主要用途是当您的代码不在内存中时可能继续播放(例如,BOOT_COMPLETED
,通过AlarmManager
安排的警报)。
答案 1 :(得分:4)
何时使用哪种方法注册
用于注册BroadcastReceiver的方法取决于您的应用对系统事件的处理方式。我认为您的应用程序想要了解系统范围的事件基本上有两个原因:
您的应用提供围绕这些活动的某种服务
您的应用想要慷慨地对状态变化作出反应
第一类的示例是需要在设备启动后立即工作的应用程序,或者必须在安装应用程序时启动某种工作的应用程序。 Battery Widget Pro或App2SD就是这类应用的好例子。对于此类型,您必须在Manifest文件中注册BroadcastReceiver。
第二类的示例是指示应用可能依赖的环境变化的事件。假设您的应用取决于已建立的蓝牙连接。您必须对状态更改做出反应 - 但仅限于您的应用处于活动状态时。在这种情况下,不需要静态注册的广播接收器。动态注册的会更合理。
还有一些事件甚至不允许您静态注册。一个例子是每分钟广播的Intent.ACTION_TIME_TICK事件。这是一个明智的决定,因为静态接收器会不必要地耗尽电池。
答案 2 :(得分:0)
根据我的理解,你的理解是正确的。
另一个相关(且模糊)差异是某些特定系统Intents只会在以编程方式注册时触发您的接收器。仅会在清单中定义的接收器不会被调用。 例如:ACTION_SCREEN_ON,ACTION_SCREEN_OFF,ACTION_BATTERY_CHANGED,ACTION_HEADSET_PLUG
我建议这个text提及有关意图和接收者的各种细节。