首页 > 解决方案 > (Un) 以编程方式注册 BroadastReceiver?

问题描述

我正在开发一个 Flutter 插件,即使应用程序处于后台/关闭状态,用户也可以收听电话状态。这里的问题是我希望能够以编程方式启用/禁用此服务,现在我有AndroidManifest.xml以下内容receiver

<receiver android:name=".CallerPhoneServiceReceiver">
   <intent-filter>
      <action android:name="android.intent.action.PHONE_STATE" />
   </intent-filter>
</receiver>

它工作得很好,我的dart代码在后台调用没有问题,现在我想receiver在用户决定它不想再听这个事件时禁用它,通过谷歌搜索一下我registerReceiver发现unregisterReceiver了我需要什么,但似乎unregisterReceiver只有在使用同一个对象调用并传递给registerReceiveras 参数时才有效,基本上只要应用程序保持打开状态它就可以工作,但是如果用户决定关闭应用程序并回来,我怎么能取消注册停用事件?即使用户自行停用,我也希望能够在注销时调用此方法。

我看过一些例子,说要使用sharedPreferences并保存服务是否存在ON/OFF,然后决定是否调用dart代码,但我的服务仍然保持活动状态,除了活动之外什么都不做,这可能会消耗电池,它不会出现要成为一个好的解决方案,我该怎么办?

标签: androidflutterservice

解决方案


您可以使用文件中定义的PackageManager启用或禁用。参考下面的代码:BroadcastReceiverAndroidManifest

ComponentName receiver = new ComponentName(context, CallerPhoneServiceReceiver.class);
PackageManager pm = context.getPackageManager();

pm.setComponentEnabledSetting(receiver, 
    PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
    PackageManager.DONT_KILL_APP);

您可以使用PackageManager.COMPONENT_ENABLED_STATE_DISABLED来禁用组件和PackageManager.COMPONENT_ENABLED_STATE_ENABLED启用组件。


推荐阅读