android - (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
只有在使用同一个对象调用并传递给registerReceiver
as 参数时才有效,基本上只要应用程序保持打开状态它就可以工作,但是如果用户决定关闭应用程序并回来,我怎么能取消注册停用事件?即使用户自行停用,我也希望能够在注销时调用此方法。
我看过一些例子,说要使用sharedPreferences
并保存服务是否存在ON/OFF
,然后决定是否调用dart
代码,但我的服务仍然保持活动状态,除了活动之外什么都不做,这可能会消耗电池,它不会出现要成为一个好的解决方案,我该怎么办?
解决方案
您可以使用文件中定义的PackageManager
启用或禁用。参考下面的代码:BroadcastReceiver
AndroidManifest
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
启用组件。
推荐阅读
- python-3.x - 在 tkinter 中的不同帧之间切换
- ios - 如何让 UIVIew.transform 和 UIVIew.traitCollection 一起工作?
- java - 在每个 Recycler 视图中添加自定义布局的问题
- api - 如何在 YouTube API 的帮助下提取每日观看次数和订阅人数
- c# - 弹出损坏指示器
- javascript - 把整个网站的不透明度调低除了一个元素onclick
- android - 材质卡视图描边颜色未应用
- r - tufte Rmarkdown中的gt表对齐
- c - 自定义内核不读取全局变量和 char*
- python - Django - 类函数不返回页面