繁体   English   中英

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

[英]Boot completed Broadcast receiver is not working for dynamic registration

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

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

<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

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

谢谢

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

      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

只有在使用清单静态注册时才会起作用

在代码中注册接收器

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

在清单中注册接收器

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

何时使用哪种方法进行注册

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

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

  2. 您的应用程序希望对状态更改做出慷慨的反应

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM