在清单或代码中注册接收器是否是更好的代码实践?

时间:2011-10-24 19:20:41

标签: java android manifest receiver

我正在写一个简单的广播接收器。我之前在清单和代码中都注册了接收器。为了我的目的,这是一个简单的接收器,不需要做任何花哨的事情。

在这种情况下,是否有理由选择一种方法而不是另一种方法?是否更有效地在清单中注册接收器(执行得更快)?或者它们基本相同?

我问,因为我写的应用程序需要非常高效,而且我无法找到关于这两种方法之间实际差异的好信息。我试图遵循最好的编码习惯。

干杯

4 个答案:

答案 0 :(得分:8)

嗯,他们实际上是不同的。你似乎认为它几乎是一样的。当您在代码中注册接收器时,必须在应用程序被销毁时取消注册(实际上,当注册它的ActivityService被破坏时)。另一方面,当您在清单中声明它时,即使您的应用未运行,也可以使其可用。

请问问自己:这两种方法中哪一种最符合您的需求?

答案 1 :(得分:2)

我无法谈论一个实现一个的效率(我的直觉告诉我它太接近真的很重要),但由于Cristian的回答中暗示的原因,以编程方式注册和取消注册可能会使你的应用效率更高。

如果您在清单中注册,您的广播接收器将始终被与您的过滤器匹配的任何意图唤醒。如果以编程方式注册,您只能在特定时间唤醒您的接收器,并且您可以控制哪些意图将唤醒您的接收器以及在哪些时间。

如果您真的担心有时不需要唤醒接收器,那么请在代码中以编程方式进行。您需要更加小心,始终取消注册,并确保您的接收器始终在您预期的位置进行注册,但如果您这样做,您可以避免不必要地唤醒接收器,从而节省一些效率

答案 2 :(得分:0)

这取决于场景。

何时使用哪种方法注册

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

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

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

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

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

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

答案 3 :(得分:0)

简单地说

动态注册 - 您的应用期望在应用运行时立即发生某些事情

静态注册 - 您的应用正在等待长期发生的事情。并且由于你不能保证你的应用程序会在它发生时运行,你可以礼貌地要求android系统在它发生时通知你

除了那一点,他们都会有相同的执行

相关问题