目录
前言
不知道大家是否也想过,当你手机灭屏的时候,为什么一条微信或者QQ信息能够点亮你的屏幕?
答案就是Android的WakeLock机制。这篇文章主要是介绍如何使用WakeLock,应该还达不到详解的地步,各位同学感兴趣的可以看一下WakeLock的基本使用方法。
WakeLock使用
我们先来看一下Android官方对PowerManager和WakeLock的注解:
- PowerManager:This class gives you control of the power state of the device.
- WakeLock:A wake lock is a mechanism to indicate that your application needs to have the device stay on.
WakeLock levelAndFlags和使用场景
Level | 保持CPU | 保持屏幕亮 | 保持键盘亮 | 使用场景 |
---|---|---|---|---|
PARTIAL_WAKE_LOCK | 是 | 否 | 否 | 长时间运行的后台服务,例如Service等 |
SCREEN_DIM_WAKE_LOCK | 是 | 低亮度 | 否 | 除非必须保持CPU运行直至运算完成,否则请使用FLAG_KEEP_SCREEN_ON方式 |
SCREEN_BRIGHT_WAKE_LOCK | 是 | 高亮度 | 否 | 除非必须保持CPU运行直至运算完成,否则请使用FLAG_KEEP_SCREEN_ON方式 |
FULL_WAKE_LOCK | 是 | 高亮度 | 是 | 除非必须保持CPU运行直至运算完成,否则请使用FLAG_KEEP_SCREEN_ON方式 |
除了这四个Level之外,PowerMager还提供了两个Flag,可以配合Level使用。
FLAG | 描述 |
---|---|
ACQUIRE_CAUSES_WAKEUP | 默认情况下wake locks并不是马上开启CPU、Screen或者Keyboard的illumination(对于Screen是Dim或Bright,Keyboard是Bright. wake locks只是在被开启后(比如用户的活动),让设备延续(保存)你设定开启的状态. 但是如果加上ACQUIRE_CAUSES_WAKEUP就可以让Screen或Keyboar的illumination没开启的情况,马上开启它们。 典型的应用就是在收到一个重要的notifications时,需要马上点亮屏幕。 |
ON_AFTER_RELEASE | 当wake lock被释放的时候,当前调用wake lock的activity的计数器会被重置,所以屏幕会继续亮一段时间 |
注意:
这两个Flag和PARTIAL_WAKE_LOCK组合是没有作用的。
参考场景
写一个应用,可以完成如下场景:
- 主Activity点击一个Button,起了一个线程,先sleep 10秒,然后关闭屏幕。
- 线程里去获取WakeLock锁,点亮屏幕并打印信息到日志中。
具体代码如下:
MainActivity.java
private void testWakeLock() {
new Thread(new Runnable() {
private void printLog() {
for (int i = 0; i < 10; i ++) {
Log.e("wangzhengyi", "hello log " + i);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
Log.e("wangzhengyi", "ready to acquire wakelock!");
try {
Thread.sleep(