1.前言与WakeLock简介
1.1.前言
一些手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状态下也会亮起,并提示用户有新消息。但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入休眠状态,这时,Android系统中CPU会保持在一个相对较低的功耗状态,而收到新消息必定有网络请求,而网络请求是消耗CPU的操作,那么如何在锁屏状态乃至系统进入休眠后,仍然保持系统的网络状态以及通过程序唤醒手机呢?答案就是Android中的WakeLock机制。
1.2. Wakelock 锁机制
应用程序可以通过申请 wakelock 锁的机制来对系统是否待机作出投票,当有任何一个应用申请了 wakelock 锁,待机时没有释放掉,系统是不会进入待机的,直到所有应用的 wakelock 锁都释放掉了,才会进入待机。
2.WakeLock使用
2.1.添加使用权限
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DEVICE_POWER" />
2.2.获取与释放锁
private PowerManager.WakeLock wakeLock = null;
private static final String mWakeLockName = "BackupService";
/**
* 获取电源锁,保持该服务在屏幕熄灭时仍然获取CPU时,保持运行
*/
private synchronized void acquireWakeLock() {
if (null == wakeLock) {
PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK
| PowerManager.ON_AFTER_RELEASE, mWakeLockName);
if (null != wakeLock) {
LogUtil.d(TAG, "acquireWakeLock!");
wakeLock.acquire();
}
}
}
/**
* 释放设备电源锁
*/
private synchronized void releaseWakeLock() {
if (null != wakeLock) {
LogUtil.d(TAG, "releaseWakeLock!");
wakeLock.release();
wakeLock = null;
}
}
2.3.WakeLock 类型以及说明:
- PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。
- SCREEN_DIM_WAKE_LOCK:保持CPU运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯
- SCREEN_BRIGHT_WAKE_LOCK:保持CPU运转,允许保持屏幕高亮显示,允许关闭键盘灯
- FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度
- ACQUIRE_CAUSES_WAKEUP:强制使屏幕亮起,这种锁主要针对一些必须通知用户的操作.
- ON_AFTER_RELEASE:当锁被释放时,保持屏幕亮起一段时间
2.4 WakeLock注意事项
WakeLock的设置是 Activiy 级别的,不是针对整个Application应用的。所以application下有多个activity一定需要注意下!
3.潜在问题
之前公司手机查功耗这块,也是我们框架组负责的,导致功耗问题的原因非常多,其中包括一些应用WakeLock不释放,导致功耗不通过。所以获取与释放一定要配对使用,不然要么GG了,再不然估计就要被强杀策略强杀了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)