电量优化
电量的检测
注册系统广播监测
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(filter,receiver);
缺点:
- 获取的是手机整体的电量,不是某个app的耗电量
Battery Historian
Battery Historian可以方便的看到各耗电模块随着时间的耗电情况:包含操作类型、执行时间、对应App等;还可以进行筛选特定的App,给出一个总结性的说明,包括:Network Information、 Syncs、WakeLock、Services、Process info、Scheduled Job、Sensor Use等,查看每一个模块的总结,可以看出来每一项的耗时以及执行次数。
电量优化的一些措施
代码上尽量少执行无谓的操作
网络传输上的优化
- 数据采取压缩的方式传输,缩减传输的时间,降低电量消耗
- 在更快的网络下进行通信(虽然3G芯片比Wifi芯片耗电低,但Wifi的速率可以让数据在较短时间内完成传输)
- 网络操作尽量集中处理
GPS
- 选择合适的Location Provider
- GPS_PROVIDER
- NETWORK_PROVIDER
- PASSIVE_PROVIDER
- 及时注销定位监听
- 在获取到定位之后或者程序处于后台时,注销定位监听,此时监听GPS传感器相当于执行no-op,用户不会有感知但是却耗电
- 多模块使用定位尽量复用
谨慎使用WakeLock
Wake Lock是一种锁的机制,只要有人拿着这个锁,系统就无法进入休眠。
- App在前台不要申请WakeLock,此时无需申请,申请的话会计算到应用电量消耗;
- App在后台由于业务需要必须要申请WakeLock时使用带有超时参数的方法,防止由于忘记或者异常情况下没有释放;
- App申请使用WakeLock,任务结束之后及时释放,让系统再次进入休眠状态。
PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK| PowerManager.ON_AFTER_RELEASE,TAG);
wl.acquire(TIMEOUT);// 使用带有超时参数的acquire方法
// ... do work...
wl.release();
传感器
- 使用传感器,选择合适的采样率,越高的采样率类型则越费电
- SENSOR_DELAY_NOMAL (200000微秒)
- SENSOR_DELAY_UI (60000微秒)
- SENSOR_DELAY_GAME (20000微秒)
- SENSOR_DELAY_FASTEST (0微秒)
- 后台及时注销传感器监听