我们有一款可以扫描蓝牙设备的应用。负责扫描的代码只应在启用蓝牙时运行。此外,我们希望在任何时间点禁用/启用此功能。
我们选择实现一个注册BluetoothAdapter.ACTION_STATE_CHANGED广播的BroadcastReceiver。
这里遇到了一些问题:
以编程方式启用BroadcastReceiver:
public void registerForBroadcasts(Context context) {
IntentFilter bluetooth = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
context.registerReceiver(this, bluetooth);
}
在清单中声明BroadcastReceiver
<receiver android:name="com.mypackage.BroadcastReceiver">
<intent-filter>
<action android:name="android.bluetooth.adapter.action.STATE_CHANGED"/>
</intent-filter>
</receiver>
将Manifest中的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将保持启用状态。它结合了两种方法的优点。
我错过了什么,这种方法看起来合法吗?
答案 0 :(得分:7)
可以以编程方式启用/禁用接收器。
以编程方式启用
PackageManager pm = Re_editActivity.this.getPackageManager();
ComponentName componentName = new ComponentName(currentActivity.this, name_of_your_receiver.class);
pm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
以编程方式禁用
PackageManager pm = Re_editActivity.this.getPackageManager();
ComponentName componentName = new ComponentName(currentActivity.this, name_of_your_receiver.class);
pm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
清单接收器
<receiver android:name="name_of_your_receiver" android:enabled="false">
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
答案 1 :(得分:6)
无法禁用BroadcastReceiver。
当然可以。正如您在第三个场景中所做的那样,使用PackageManager
和setComponentEnabledSetting()
。
我错过了什么,这种方法看起来合法吗?
至少在管理BroadcastReceiver
方面,这是非常合法的。我不知道是否有任何蓝牙特定的打嗝,但我会怀疑。此技术用于各种广播,例如,当您确实需要在启动时完成某些操作时,仅监听ACTION_BOOT_COMPLETED
。