我正在开发一个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
只有在用同一对象调用时才能工作,并将其作为参数传递给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
启用组件。