以编程方式启用/禁用Broadcastreceiver

时间:2014-06-17 14:09:37

标签: android

我们有一款可以扫描蓝牙设备的应用。负责扫描的代码只应在启用蓝牙时运行。此外,我们希望在任何时间点禁用/启用此功能。

我们选择实现一个注册BluetoothAdapter.ACTION_STATE_CHANGED广播的BroadcastReceiver。

这里遇到了一些问题:

以编程方式启用BroadcastReceiver:

public void registerForBroadcasts(Context context) {
    IntentFilter bluetooth = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
    context.registerReceiver(this, bluetooth);
}
  1. 当应用程序被杀死时,BroadcastReceiver也不再处于活动状态。因此,如果用户多任务 - 将应用程序刷死,则不会再次被唤醒。
  2. 我们完全可以控制,何时启动BroadcastReceiver。
  3. 在清单中声明BroadcastReceiver

    <receiver android:name="com.mypackage.BroadcastReceiver">
        <intent-filter>
            <action android:name="android.bluetooth.adapter.action.STATE_CHANGED"/>
        </intent-filter>
    </receiver>
    
    1. 应用程序启动后,BroadcastReceiver处于活动状态。
    2. 无法禁用BroadcastReceiver。
    3. 将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将保持启用状态。它结合了两种方法的优点。

      1. 可以禁用BroadcastReceiver
      2. 默认情况下,BroadcastReceiver可以开启或关闭
      3. 即使禁用应用并重新启动手机,BroadcastReceiver也会保持激活状态。
      4. 我错过了什么,这种方法看起来合法吗?

2 个答案:

答案 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。

当然可以。正如您在第三个场景中所做的那样,使用PackageManagersetComponentEnabledSetting()

  

我错过了什么,这种方法看起来合法吗?

至少在管理BroadcastReceiver方面,这是非常合法的。我不知道是否有任何蓝牙特定的打嗝,但我会怀疑。此技术用于各种广播,例如,当您确实需要在启动时完成某些操作时,仅监听ACTION_BOOT_COMPLETED