[英]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的方法取决于您的应用程序对系统事件的处理方式。 我认为您的应用程序想要了解系统范围的事件基本上有两个原因:
您的应用程序围绕这些活动提供某种服务
您的应用程序希望对状态更改做出慷慨的反应
第一类的示例是需要在设备启动后立即工作的应用程序,或者必须在安装应用程序时启动某种工作的应用程序。 Battery Widget Pro或App2SD就是这类应用的好例子。 对于此类型,您必须在Manifest文件中注册BroadcastReceiver。
第二类的示例是指示应用可能依赖的环境变化的事件。 假设您的应用取决于已建立的蓝牙连接。 您必须对状态更改做出反应 - 但仅限于您的应用处于活动状态时。 在这种情况下,不需要静态注册的广播接收器。 动态注册的会更合理。
还有一些事件甚至不允许您静态注册。 一个例子是每分钟广播的Intent.ACTION_TIME_TICK事件。 这是一个明智的决定,因为静态接收器会不必要地耗尽电池。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.