gpt4 book ai didi

android - 以编程方式启用/禁用 Broadcastreceiver

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:17:15 25 4
gpt4 key购买 nike

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

我们选择实现 BroadcastReceiver 来注册 BluetoothAdapter.ACTION_STATE_CHANGED 广播。

这里是我们遇到的一些问题:

以编程方式启用 BroadcastReceiver:

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

在Manifest中声明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。

在 list 中将 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 保持激活状态,即使应用被禁用并且手机重新启动也是如此。

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

最佳答案

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

以编程方式启用

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);

list 接收者

<receiver android:name="name_of_your_receiver" android:enabled="false">
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>

关于android - 以编程方式启用/禁用 Broadcastreceiver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24266039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com