BPFP系列:优化电池使用时间:监控电池电量和充电状态

2019-04-14 12:25发布

本文翻译或摘取自google官方文档 Best Practices for Performance http://developer.android.com/intl/zh-cn/training/best-performance.html

优化电池使用时间


为了打造一个优秀的应用,您应设法降低应用对电池使用时间的影响。阅读完本教程后,您就可以让自己构建的应用根据其所在设备的状态来监控和调整自身的功能和行为。 要确保在不影响用户体验的情况下最大程度地降低应用对电池使用时间的影响,您可以采取一些措施,例如在网络连接断开时停用后台服务更新,或在电池电量较低时降低此类更新的频率。

监控电池电量和充电状态


如果您要更改后台更新频率,从而减少更新对电池使用时间的影响,最好先查看当前的电池电量和充电状态。 对应用进行更新会影响电池使用时间,具体取决于设备的电池电量和充电状态。如果用户正在通过交流电源为设备充电,更新应用的影响就可以忽略不计。因此,在大多数情况下,只要设备连接了充电器,您就可以最大程度地提高刷新频率。相反,如果设备在消耗电池电量,那么降低更新频率就可以延长电池使用时间。 同样,您也可以查看电池电量,如果电量即将耗尽,您就可以降低更新频率,甚至停止更新。


确定当前的充电状态


请先确定当前的充电状态。BatteryManager 会通过一个包含充电状态的持续 Intent 广播所有的电池详情和充电详情。 由于这是个持续 intent,因此您无需通过将传入 null  registerReceiver 作为接收器直接调用(如下一代码段所示)来注册 BroadcastReceiver,系统会返回当前电池状态 intent。您可以在此处传入实际的BroadcastReceiver 对象,不过我们会在下文中介绍如何处理更新,因此您不一定要执行此操作。 IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter); 如果设备正在充电,则您可以提取当前的充电状态和充电方式(无论是通过 USB 还是交流充电器),如下所示: // 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 = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BATTERY_PLUGGED_AC; 通常,如果设备连接了交流充电器,您就应最大程度地提高后台更新频率;如果设备通过 USB 充电,请降低更新频率;如果电池在耗电,请进一步降低更新频率。

监控充电状态的变化


充电状态的改变就像设备连接电源那样容易,因此监控充电状态的变化并相应地调整刷新频率就很重要了。 只要设备连接或断开电源,BatteryManager 就会广播相应的操作。即使您的应用没有运行,也请务必接收这些事件,尤其是当这些事件会影响您启动应用以执行后台更新的频率时。因此,您应该通过在 intent 过滤器中定义ACTION_POWER_CONNECTED  ACTION_POWER_DISCONNECTED,在清单中注册 BroadcastReceiver 来侦听这两个事件。 android:name=".PowerConnectionReceiver">       android:name="android.intent.action.ACTION_POWER_CONNECTED"/>     android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>   在实施相关的 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 == BATTERY_PLUGGED_USB;         boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;     } }

确定当前的电池电量


在某些情况下,确定当前的电池电量会对您有所帮助。如果电池电量低于一定水平,您可以降低后台更新频率。 您可以从电池状态 intent 中提取要了解的当前电池电量以及电池容量,具体如下所示: int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level / (float)scale;

监控电池电量的显著变化


您无法轻松地对电池状态进行持续监控,不过也无需这么做。 一般来说,与应用的正常行为相比,持续监控电池电量会消耗更多电量。因此,比较合适的做法是只监控电池电量的显著变化(尤其是在设备进入或结束低电量状态的情况下)。 以下清单代码段提取自广播接收器中的 intent 过滤器元素。通过侦听 ACTION_BATTERY_LOW ACTION_BATTERY_OKAY,只要设备的电池进入或结束低电量状态,系统就会触发接收器。 android:name=".BatteryLevelReceiver">   android:name="android.intent.action.ACTION_BATTERY_LOW"/>   android:name="android.intent.action.ACTION_BATTERY_OKAY"/>  
如果电池电量极低,通常比较合适的做法是停用所有后台更新。如果您还没用上更新的数据,手机就自动关机了,那这些数据再新也没有意义。 在很多情况下,将设备插入基座就可以为其充电。下一教程将向您介绍如何确定当前基座状态及如何监控设备对接的变化。