Android O中广播充电器已断开连接

8
现在 Android O 的最终 API 已经发布,以下广播都未被列入白名单,我遇到了以下问题:
我的应用程序(目标 API 25)目前有一个 BroadcastReceiver,用于监听 ACTION_POWER_CONNECTED 和 ACTION_POWER_DISCONNECTED 的系统事件。现在我想将我的应用程序更新为针对 Android O,但是随着这个版本的发布,广播行为发生了巨大的变化:
引用: 应用程序不能再其清单中注册隐式广播接收器。隐式广播是不特定于该应用程序的广播。
由于这两个广播都是隐式的,因此我只能通过 Context.registerReceiver() 方法注册它们,但是这会带来一个问题:一旦我的应用程序进程被系统杀死或者系统清除我的应用程序的内存(由于设备内存不足),广播注册就会丢失。
为避免这个问题,我可以使用 JobScheduler API,并使用 setRequiresCharging 方法来处理 ACTION_POWER_CONNECTED 事件,但是对于 ACTION_POWER_DISCONNECTED 事件,我必须使用 registerReceiver 方法。
由于我的应用程序控制设备的音量(基于这些事件),因此没有任何一个事件被忽略是非常重要的。那么在 Android O 中,如何安全地监听断开电源事件呢?
顺便说一下,我在 WIFI 断开事件上也遇到了同样的问题。
编辑:我希望在没有前台服务通知的情况下完成此操作。

1
为了增强电池使用,引入了这个限制。平均每个用户安装了95个应用程序,想象一下其中有多少可能对该事件感兴趣。如果每个感兴趣的应用程序都有机会对该事件做出反应,那么电池使用量将大大受到影响。相反,Google建议我们开发人员在某些窗口期间轮询状态。创建您的作业,在该窗口期间进行断言。 - azizbekian
可以动态注册电源意图的广播接收器吗?我正在尝试在已经存在的前台服务中注册它们,但它们似乎从未被触发。 - mike47
3个回答

2

系统可以无拘束地延迟作业。setOverrideDeadline方法只使用尽力而为的策略,因此在这种情况下,您可以将目标SDK保持在25或使用前台服务。前台服务可能会被系统杀死,但概率非常低。


2

这可能有些过度,但是您可以在由 ACTION_BOOT_COMPLETED 启动的前台 Service 中注册这些广播。


-3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接