Android如何无需后台轮询实现电量高于指定阈值时推送通知?
实现可行性与方案说明
可以通过Broadcast Receiver实现该功能,不需要持续后台轮询,仅需极低功耗即可实现即便应用未运行也能触发高电量通知的需求,具体实现建议如下:
核心广播类型说明
安卓系统原生提供了几个不需要额外权限的系统广播用于电量状态监听:
- 电量变化广播:
ACTION_BATTERY_CHANGED,电量每波动1%左右触发一次,属于粘性广播,安卓8.0及以上版本仅支持动态注册接收,静态注册无法生效 - 充电状态切换广播:
ACTION_POWER_CONNECTED(插入充电器)、ACTION_POWER_DISCONNECTED(拔出充电器),属于系统豁免的隐式广播,静态注册后即便应用未运行也能正常接收
推荐实现方案
因为非充电场景下手机电量只会持续下降,不会出现电量上涨到指定阈值的情况,所以仅需要在充电状态下做电量监听即可,完全不需要后台持续运行:
方案1:静态充电广播+动态电量广播组合(功耗最低)
- 在AndroidManifest中静态注册
ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED两个广播接收器 - 当用户插入充电器触发
ACTION_POWER_CONNECTED广播时,先获取当前电量:- 如果当前电量已经高于你设置的提醒阈值,直接触发通知即可
- 如果当前电量未达到阈值,再动态注册
ACTION_BATTERY_CHANGED广播,监听后续电量上涨
- 当动态广播收到电量变化时判断是否达到阈值,达到阈值后立即触发通知,同时注销
ACTION_BATTERY_CHANGED动态广播,结束监听 - 当用户拔出充电器触发
ACTION_POWER_DISCONNECTED广播时,直接注销之前注册的ACTION_BATTERY_CHANGED动态广播,避免无效监听
方案2:配合WorkManager兜底(兼容性更强)
如果担心高版本安卓的广播接收限制导致漏触发,可以补充极低功耗的WorkManager任务做兜底:
- 配置仅在设备充电、设备空闲时触发的一次性Work任务,系统强制最低触发间隔为15分钟,远低于每分钟轮询的功耗
- 每次任务触发时检查当前电量,达到阈值就发送通知,未达到则重新安排下一次任务即可
- 该方案完全由系统调度,不需要应用主动驻留后台,不会被系统判定为异常耗电
通知效果适配
要达到和系统低电量通知类似的效果,需要做以下适配:
- 安卓8.0及以上版本发送通知前必须先创建
NotificationChannel通知渠道,将渠道重要级别设置为IMPORTANCE_HIGH,即可实现弹出横幅、播放提示音的效果 - 通知样式可以使用系统默认的大文本样式,可根据需求添加关闭提醒、跳转应用的操作按钮
内容的提问来源于stack exchange,提问作者Gimuser39
相关产品推荐
相关产品推荐

