Android为了节省电量,会在用户无操作一段时间之后进入休眠状态。Wake Lock是一种锁的机制,只要有人拿着这个锁,系统就无法进入休眠。一些App为了能在后台持续做事情,就会持有一个WakeLock,那么手机就不会进入休眠状态,App要做的事情能做了,但是也更加耗电。
我使用百度地图android sdk开发了一个app,可以在户外徒步过程中,定位当前的GPS位置。锁屏后会进cpu休眠,定时定位功能失效。为了保证后台的service能够安全的监听GPS信号,按照这个帖子的方案增加了wakelock(帖子地址http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=9660&extra=page%3D1&page=1)。今天找机会测试了一下,将测试后的电池信息通过battery-historian分析,发现长时间持有wakelock,会导致CPU一直忙而耗电。
下面就是battery-historian工具分析后的电池使用情况,图的左侧各行是android各个组件,右侧坐标是battery level电池电量,横坐标就是时间,中间的一条折现就是电池电量随着时间的变化情况。
从早上9点到下午2点50分,一直都打开app,也就是字母为a的区域。这期间userspace wakelock一直都持有,而CPU running也是一直在用,从电池电量的折线可以看到,电池消耗很快。
在下午3点到5点30分左右,关闭app,也就是字母b的区域。这期间userspace wakelock间歇持有,同时CPU running也是间歇在用,从电池电量折线可以看到,电池消耗变得缓慢。
因此需要对wakelock的使用进行优化。
1、App在前台不要申请WakeLock,此时无需申请,申请的话会计算到应用电量消耗;
2、App在后台由于业务需要必须要申请WakeLock时使用带有超时参数的方法,防止由于忘记或者异常情况下没有释放;
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK| PowerManager.ON_AFTER_RELEASE,TAG);
wl.acquire(TIMEOUT);// 使用带有超时参数的acquire方法
// ... do work...
wl.release();
3、App申请使用WakeLock,任务结束之后及时释放,让系统再次进入休眠状态。