我创建了一个广播接收器并使用以下方法在清单中注册它正常工作
静态方式注册广播接收器(工作正常)
<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
没有编译和运行时错误。但是设备重启后接收器没有收到广播
由于
答案 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的方法取决于您的应用对系统事件的处理方式。我认为您的应用程序想要了解系统范围的事件基本上有两个原因:
您的应用提供围绕这些活动的某种服务
您的应用想要慷慨地对状态变化作出反应
第一类的示例是需要在设备启动后立即工作的应用程序,或者必须在安装应用程序时启动某种工作的应用程序。 Battery Widget Pro或App2SD就是这类应用的好例子。对于此类型,您必须在Manifest文件中注册BroadcastReceiver。
第二类的示例是指示应用可能依赖的环境变化的事件。假设您的应用取决于已建立的蓝牙连接。您必须对状态更改做出反应 - 但仅限于您的应用处于活动状态时。在这种情况下,不需要静态注册的广播接收器。动态注册的会更合理。
还有一些事件甚至不允许您静态注册。一个例子是每分钟广播的Intent.ACTION_TIME_TICK事件。这是一个明智的决定,因为静态接收器会不必要地耗尽电池。