- Standby
最低的状态,没有数据连接需要传输,电量消耗最少。
总之,为了减少电量的消耗,在蜂窝移动网络下,最好做到批量执行网络请求,尽量避免频繁的间隔网络请求。
使用 Battery Historian 我们可以得到设备的电量消耗数据,如果数据中的移动蜂窝网络(Mobile Radio)电量消耗呈现下面的情况,间隔很小,又频繁断断续续的出现,说明电量消耗性能很不好:
battery bad
经过优化之后,如果呈现下面的图示,说明电量消耗的性能是良好的:
battery good
另外 WiFi 连接下,网络传输的电量消耗要比移动网络少很多,应该尽量减少移动网络下的数据传输,多在 WiFi 环境下传输数据。
battery wif
那么如何才能够把任务缓存起来,做到批量化执行呢?我们可以使用 JobScheduler 来优化。
我们可以通过下面的代码来获取手机的当前充电状态:
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = this.registerReceiver(null, filter);
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean acCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_AC);
if (acCharge) {
Log.v(LOG_TAG, “The phone is charging!”);
}
在上面的例子演示了如何立即获取到手机的充电状态,得到充电状态信息之后,我们可以有针对性的对部分代码做优化。
比如:我们可以判断只有当前手机为 AC 充电状态时 才去执行一些非常耗电的操作。
private boolean checkForPower() {
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = this.registerReceiver(null, filter);
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_USB);
boolean acCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_AC);
boolean wirelessCharge = false;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
wirelessCharge =
(chargePlug == BatteryManager.BATTERY_PLUGGED_WIRELESS);
}
return (usbCharge || acCharge || wirelessCharge);
}
监听充电状态变化
在清单文件中注册一个 BroadcastReceiver,通过在一个 Intent 过滤器内定义 ACTION_POWER_CONNECTED
和 ACTION_POWER_DISCONNECTED
来同时侦听这两种事件。
创建监听充电状态变化的 PowerConnectionReceiver。
public class PowerConnectionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS,
BatteryManager.BATTERY_STATUS_UNKNOWN);
String batteryStatus = “”;
switch (status) {
case BatteryManager.BATTERY_STATUS_CHARGING:
batteryStatus = “正在充电”;
break;
case BatteryManager.BATTERY_STATUS_DISCHARGING:
batteryStatus = “正在放电”;
break;
case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
batteryStatus = “未充电”;
break;
case BatteryManager.BATTERY_STATUS_FULL:
batteryStatus = “充满电”;
break;
case BatteryManager.BATTERY_STATUS_UNKNOWN:
batt