Android targetSdkVersion>25时如何监听电池充电状态变化
监听Android设备充电状态变化的方案
针对targetSdkVersion ≤25的情况
当你的应用targetSdkVersion不超过25时,可以通过隐式Intent的BroadcastReceiver来监听电池充电状态的变化,只需在Manifest里声明对应的接收器即可:
<receiver android:name=".PowerConnectionReceiver"> <intent-filter> <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/> </intent-filter> </receiver>
这个接收器会在设备连接电源(ACTION_POWER_CONNECTED)和断开电源(ACTION_POWER_DISCONNECTED)时被触发。
针对targetSdkVersion >25的情况
从Android 8.0(API 26)开始,系统禁用了大部分隐式广播Intent(仅有少数显著例外)。如果此时仍使用上述Manifest声明的隐式广播接收器,会看到类似W/BroadcastQueue: Background execution not allowed: receiving Intent的警告,且接收器无法正常工作。
充电连接的监听方案
对于设备进入充电状态的场景,可以使用JobScheduler来调度任务,设置仅当设备处于充电状态时才执行对应的逻辑,这种方式符合系统的后台限制要求。
电源断开的高效监听方案
目前比较可行的方案是使用AlarmManager定期轮询电池的充电状态:
- 设置一个合适间隔的重复闹钟,每次触发时通过
BatteryManager的相关API获取当前电池的充电状态 - 对比上次记录的状态,判断是否发生了电源断开的变化,再执行对应的业务逻辑
内容的提问来源于stack exchange,提问作者rundavidrun
相关产品推荐
相关产品推荐

