当前位置: 首页 > 知识库问答 >
问题:

以编程方式启用/禁用Broadcast接收机

鲁华茂
2023-03-14

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

我们选择实现为BluetoothAdapter注册的BroadcastRecector。ACTION_STATE_CHANGED广播。

以下是我们遇到的一些问题:

以编程方式启用BroadcastRecector:

public void registerForBroadcasts(Context context) {
    IntentFilter bluetooth = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
    context.registerReceiver(this, bluetooth);
}
  1. 当应用程序被终止时,BroadcastReceiver也不再处于活动状态。因此,如果用户多任务刷死应用程序,它不会再次被唤醒
  2. 我们完全可以控制何时启动广播接收器

在清单中声明BroadcastRecector

<receiver android:name="com.mypackage.BroadcastReceiver">
    <intent-filter>
        <action android:name="android.bluetooth.adapter.action.STATE_CHANGED"/>
    </intent-filter>
</receiver>
  1. 在应用程序启动后,BroadcastRecector处于活动状态。
  2. 不能禁用BroadcastRecector。

将清单中的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);
}

我的测试显示,该状态与系统保持一致,因此BroadcastRecector将保持启用状态。它结合了两种方法的优点。

  1. 广播接收器可以被禁用

我是否遗漏了什么,这个方法合法吗?

共有2个答案

卫高谊
2023-03-14

不能禁用BroadcastRecector。

当然可以。请使用PackageManagersetComponentEnabled设置(),就像您在第三个场景中所做的那样。

我是否遗漏了什么,这个方法合法吗?

这是非常合法的,至少在管理广播接收器方面是如此。我不知道是否有任何蓝牙特定的问题,尽管我会怀疑它。此技术用于各种广播,例如,当您确实需要在启动时执行某些操作时,仅收听操作\u BOOT\u COMPLETED

厍胤运
2023-03-14

可以通过编程方式启用/禁用接收器。

以编程方式启用

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>
 类似资料:
  • 是否有一种编程(基于属性)的方法在Spring引导(1.2.2)中禁用RabbitAutoConfiguration。 看起来像Spring。rabbitmq。dynamic=false仅禁用AmqpAdmin,而不禁用连接工厂等。 我们想要一个模型,其中应用程序属性可以来自Spring Cloud config(包括控制总线)或通过-D jvm args。这个决定是在部署时做出的。当属性来自-D

  • 问题内容: 我需要从Windows XP中的脚本启用/禁用完全网络接口。我正在寻找python解决方案,但是任何通用的方式(例如WMI,某些命令行ànetsh,某些Windows调用)都是受欢迎的,并且会进行调整。谢谢。 问题答案: 使用netsh接口用法设置接口[name =] IfName [[admin =] ENABLED | DISABLED [connect =] CONNECTED

  • 本文向大家介绍如何以编程方式在iOS中启用/禁用数据连接?,包括了如何以编程方式在iOS中启用/禁用数据连接?的使用技巧和注意事项,需要的朋友参考一下 用户可以通过iOS设备的设置打开或关闭移动数据,但是实际上不可能以编程方式禁用或启用相同功能。仅当您越狱iOS设备时才有可能。Apple不允许任何应用程序开发人员访问wifi或蓝牙。 有一些私有API可能会帮助您解决此问题,但最终会导致应用商店拒绝

  • 我正在开发一个应用程序,用户可以通过点击按钮启用/禁用移动网络。我在谷歌上搜索过这个问题,但我只得到了飞机模式的解决方案。在飞行模式下,WI-FI和蓝牙也被禁用。我不希望他们使用飞机模式的概念来禁用。我只想禁用移动网络。按语法实现它的可能方式是什么?

  • 问题内容: 我需要重新启动我的应用程序,以防万一我重新加载需要从一开始就开始的内容。我试过了 但我收到一个错误 启动路径不可访问 问题答案: 尽管问题本身是微不足道的(忘记了路径),但在其他人需要相同功能的情况下,我还是留下了疑问。 编辑 (Sw3的每日Swift语法更改; Sw4也适用):

  • 问题内容: 如何以编程方式为特定类启用断言,而不是指定命令行参数“ -ea”? 问题答案: 这是对@bala好的答案的评论,但时间太长。 如果仅启用断言,则调用您的主类-您的主类将在启用断言之前加载,因此您可能需要一个不直接引用代码中其他内容的加载器。它可以设置断言,然后通过反射加载其余代码。 如果在加载类时未启用断言,则应立即将其“编译出”,这样您就无法打开和关闭它们。如果要切换它们,则根本不需