Contents
监测电量和充电状态
当你调整后台更新的频率以降低频繁更新导致电池老化的问题时,从检查当前电量和充电状态开始是个不错的选择。
应用更新对电池寿命的影响依赖于电池电量和充电状态。当手机连接外接电源时,应用更新带来的影响几乎可以忽略不计,所以大多数情况下,当手机连接电源时,你可以将刷新率提到最高。相反,如果手机没充电时,降低刷新率会延长电池寿命。
相似的,你可以检查电池电量,可能的情况下降低更新频率甚至在电量即将耗尽的时候关掉更新。
确定当前充电状态
首先是确定当前的充电状态。BatteryManager广播通过一个sticky intent所有电池和充电细节,包括充电状态。
因为是sticky intent,所以不用注册BroadcastReceiver,像下面的代码段所示,只需要简单的调用registerReceiver,传入一个null作为接收者,当前电池状态的intent就可以返回。这里也可以传入一个实际的BroadcastReceiver对象,但是没有必要,因为我们后面会有更新。
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
既可以确定电源的充电状态,也可以查看充电设备类型,比如USB或AC。
// Are we charging / charged? int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; // How are we charging? int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
通常情况下,AC充电时,你应该把后台更新频率设成最大,USB充电时,降低频率,不充电时,降得更低。
监测充电状态变化
充电状态很容易改变,比如设备被插入插头,所以监测充电状态的变化并据此调整频率很重要。
设备连上电源和断开外接电源时,BatteryManager都会发出广播。就算你的应用并未运行,接收这个广播也很重要,因为这两个事件影响你应用启动并做后台更新的频率,所以你应该在manifest文件注册接收这两个事件通知的一个BroadcastReceiver。像下面一样:
<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>
在这个BroadcastReceiver实现中,就可以像上面方法一样得到当前的充电状态了。
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 == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; } }
确定当前电量水平
有些情况下,确定当前电量水平也很重要。你可以选择在电量低于某个值的时候降低应用更新的频率。
你可以从电池状态intent中提取当前电量和比例,如下所示:
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level / (float)scale;
监测电量的重要变化
持续监测电池状态不容易,但你不必这么做。
一般来说,持续监测电量变化对电池的影响会超过对你应用行为的影响。所以最好是指监测点亮的重要变化,比如电池电量进入或退出低电量状态。如下所示:
<receiver android:name=".BatteryLevelReceiver"> <intent-filter> <action android:name="android.intent.action.BATTERY_LOW"/> <action android:name="android.intent.action.BATTERY_OKAY"/> </intent-filter> </receiver>
最好在设备进入低电量后关掉应用后台更新。因为不管你的数据多新,如果手机没电关机了,你也不能用。