我们有一个可以扫描蓝牙设备的应用程序。负责扫描的代码应仅在启用蓝牙时运行。此外,我们希望随时禁用/启用此功能。
我们选择实现一个注册BluetoothAdapter.ACTION_STATE_CHANGED广播的BroadcastReceiver。
这是我们遇到的一些问题:
以编程方式启用广播接收器:
public void registerForBroadcasts(Context context) {
IntentFilter bluetooth = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
context.registerReceiver(this, bluetooth);
}
- 当应用程序被终止时,BroadcastReceiver 也不再处于活动状态。所以如果用户多任务刷死应用程序,它就不会被再次唤醒。
- 我们可以完全控制何时启动 BroadcastReceiver。
在清单中声明广播接收器
<receiver android:name="com.mypackage.BroadcastReceiver">
<intent-filter>
<action android:name="android.bluetooth.adapter.action.STATE_CHANGED"/>
</intent-filter>
</receiver>
- BroadcastReceiver 在应用程序启动后立即处于活动状态。
- 无法禁用广播接收器。
将清单中的 BroadcastReceiver 声明为禁用 + 以编程方式启用它
<receiver android:name="com.mypackage.BroadcastReceiver"
android:enabled="false" >
<intent-filter>
<action android:name="android.bluetooth.adapter.action.STATE_CHANGED"/>
</intent-filter>
</receiver>
然后根据需要启用该组件。
public void registerForBroadcasts(Context context) {
ComponentName component = new ComponentName(context, BroadcastReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(
component,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
我的测试表明,状态在系统中保持不变,因此 BroadcastReceiver 将保持启用状态。它结合了两种方法的优点。
- 可以禁用广播接收器
- BroadcastReceiver默认可以打开或关闭
- 即使应用程序被禁用并且手机重新启动,BroadcastReceiver 也会保持激活状态。
我错过了什么吗,这个方法看起来合法吗?