启动完成广播接收器不适用于动态注册

时间:2013-11-21 10:35:00

标签: android broadcastreceiver

我创建了一个广播接收器并使用以下方法在清单中注册它正常工作

静态方式注册广播接收器(工作正常)

<receiver
        android:name="DeviceRestartListener"
        android:enabled="true"
        android:exported="false" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            </category> -->
        </intent-filter>
    </receiver>

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

但是当我尝试使用以下方式注册广播接收器编程(而不是静态方式)时,它不起作用 编程注册(不工作)

DeviceRestartListener dataBroadcastReceiver = new DeviceRestartListener();
            IntentFilter filter = new IntentFilter();
            filter.addAction(
                    "android.intent.action.BOOT_COMPLETED")
//registerReceiver(dataBroadcastReceiver, filter); //DOESNT WORK
registerReceiver(dataBroadcastReceiver, filter, "android.permission.RECEIVE_BOOT_COMPLETED", null); //DOESNT WORK

没有编译和运行时错误。但是设备重启后接收器没有收到广播

由于

2 个答案:

答案 0 :(得分:1)

即使在清单中静态声明或使用应用程序上下文动态注册,所有广播接收器也不会工作。例如

之类的意图动作
      Intent.ACTION_SCREEN_OFF

      Intent.ACTION_SCREEN_ON

必须动态注册。在清单中声明这些操作时不会触发这些操作。一些意图行为,如

    Intent.ACTION_TIME_CHANGED;
    Intent.ACTION_TIME_TICK;
    Intent.ACTION_TIMEZONE_CHANGED;
当通过窗口令牌不为空的上下文动态注册时,

将被触发。(如Activity或Dialog)。

类似于此,一些Intent动作如

      Intent.ACTION_BOOT_COMPLETED

仅在使用清单

进行静态注册时才有效

答案 1 :(得分:1)

在代码中注册接收器

当我们在代码中注册接收器时,我们必须在应用程序被销毁时取消注册(实际上,当注册它的Activity或Service被破坏时)。

在清单中注册收件人

当我们在清单中声明它时,即使您的应用未运行,也可以使其可用。

何时使用哪种方法注册

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

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

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

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

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

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