(取消)以编程方式注册BroadastReceiver



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

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

它工作得很好,我的dart代码是在后台调用的,没有任何问题,现在每当用户决定不想再监听这些事件时,我都想禁用这个receiver,通过谷歌搜索,我发现registerReceiverunregisterReceiver显然可以满足我的需要,但似乎unregisterReceiver只有在用同一对象调用时才能工作,并将其作为参数传递给registerReceiver,基本上,只要应用程序保持打开状态,它就可以工作,但如果用户决定关闭应用程序并回来停用事件,我该如何注销?即使用户自己停用,我也希望能够在注销的情况下调用这个方法。

我看到过一些例子,说使用sharedPreferences并保存服务是否为ON/OFF,然后决定是否调用dart代码,但我的服务仍然保持活动状态,只做活动,这可能会消耗电池,这似乎不是一个好的解决方案,我该怎么办?

您可以使用PackageManager启用或禁用AndroidManifest文件中定义的BroadcastReceiver。请参阅以下代码:

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启用组件。

最新更新