大家好,我是本期栏目编辑小友,现在为大家讲解Android电源管理监听充电状态的变化问题。
通过检查设备当前的电池电量和充电状态,然后适当改变后台服务的更新频率,可以有效降低功耗。因此,您的应用程序的更新频率也应该根据设备当前的电池电量和充电状态进行动态调整。
通常在设备充电时,可以增加应用程序的数据更新频率,因为此时电池电量的消耗与充电过程相比非常小,基本可以忽略。相反,如果电池正常使用,应用的更新频率要合理调整,不要更新太频繁,有助于延长电池的使用寿命。
同时,应用应时刻监控设备电量的状态变化,当设备电量不足时,尽量降低更新频率或干脆停止数据更新。
获取当前电池状态。
电池管理器将发送“粘性”类型的系统广播,包括当前电池充电状态和意向中的充电状态等信息。
因为电池状态的广播类型是“sTIcky”,所以我们不需要注册相应的BroadcastReceiver。在调用registerReceiver时只需要传递null参数null,然后函数的返回值意图就包括了关于当前电池状态的各种信息。
当然,您也可以传递一个自定义的BroadcastReceiver,这将在后面的章节中介绍,但实际上这不是必需的。
示例代码:
IntentFilter ifilter=新的IntentFilter(Intent。ACTION _ BATTERY _ CHANGED);
intent batteryStatus=context . register receiver(null,ifilter);
从返回的意向中,我们可以得到当前的充电状态和充电类型,无论是通过USB还是交流充电器。
//我们正在充电/充电吗?
int status=batterystatus . getintextra(BatteryManager。EXTRA_STATUS,-1);
boolean is arging=status==BatteryManager。电池_状态_充电||
status==BatteryManager。电池状态满;
//我们如何收费?
int charge replug=battery . getintextra(battery manager。EXTRA_PLUGGED,-1);
布尔usbCharge=charge plug==BATTERY _ plug _ USB;
布尔acCharge=charge plug==BATTERY _ plug _ AC;
一般在交流充电器的情况下,可以将应用程序的更新频率最大化,如果USB充电了,就要适当降低更新频率,而如果没有充电,就要将更新频率降到最低,合理用电。
监控充电状态的变化。
作为一款便携的插电式充电设备,充电和非充电状态切换可能会非常频繁,所以你的应用应该监控这种状态切换,随时调整应用的刷新频率。
当设备连接到电源进行充电或断开充电电源时,系统的电池管理器将发送广播。
您应该在应用程序中注册并收听此系统广播,即使您的应用程序当前没有运行。如果这些状态切换会影响应用程序后台服务的更新频率,您应该注册一个。
BroadcastReceiver 来监听这两个事件,分别为 ACTION_POWER_CONNECTED 和 ACTION_POWER_DISCONNECTED示例代码:
《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》
在 BatteryManager 中Receiver的实现代码中,您可以获得当前电池的状态信息,这在上文已经提及。
示例代码:
public class PowerConnectionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;
}
}
获得当前的电池电量等级
很多时候需要获取当前的电量等级,当电池电量低于某一个级别的时候,您的应用程序应当降低后台服务的更新频率来尽量减小电量的消耗,您可以通过上文获取到的Intent来取得当前电量的Level和Scale,进而可以算出当前电量的百分比。
示例代码:
int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float batteryPct = level / (float)scale;
监测电池电量的显着变化
通常来说,我们没有必要一直持续的监听电池的状态变化,主要集中关注于电池电量在 “low battery state” 附近的变换即可,
示例代码展示了监听电池电量在“low battery state” 状态的变化,分为为进入低电量状态和返回到电池电量正常的状态。
对应的 Action分别为 ACTION_BATTERY_LOW 和 ACTION_BATTERY_OKAY 。
《receiver android:name=“.BatteryLevelReceiver”》
《intent-filter》
《action android:name=“android.intent.action.ACTION_BATTERY_LOW”/》
《action android:name=“android.intent.action.ACTION_BATTERY_OKAY”/》
《/intent-filter》
《/receiver》
比较好的解决方案是:当电池的电量非常低的时候,禁用所有程序的后台更新服务,如果手机因为电量不足自动关机,那么这个时候的最新数据也基本没有什么作用。
通常当把Android设备放入一个Dock(设备底座)中就进入了充电状态。