1. 概述
PowerManager 管理设备的电源状态。它的使用会显著地影响到设备电池寿命,除非的确需要,轻易不要获取PowerManager唤醒锁(PowerManager.WakeLock),而且尽可能使用最小级别,一定要尽快释放。
您可以通过调用Context.getSystemService()获取PowerManager 的实例,以及使用newWakeLock()方法创建PowerManager唤醒锁(PowerManager.WakeLock)对象,然后使用唤醒锁(WakeLock)对象中的方法去控制设备电源的状态。
在实践中,这很简单:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag"); wl.acquire(); ... ... //在acquire() 和 release()之间这屏幕将一直灰暗地亮着 wl.release();
以下是唤醒锁级别的定义,它们的不同对系统电源的影响也不同。这些级别是互斥的,您只能指定其中一个。
Flag Value | CPU | Screen | Keyboard |
---|---|---|---|
PARTIAL_WAKE_LOCK |
On* | Off | Off |
SCREEN_DIM_WAKE_LOCK |
On | Dim | Off |
SCREEN_BRIGHT_WAKE_LOCK |
On | Bright | Off |
FULL_WAKE_LOCK |
On | Bright | Bright |
* 如果您持有partial唤醒锁(PARTIAL_WAKE_LOCK), 不管任何显示超时或屏幕的状态如何以及甚至用户按电源按钮, CPU 将持续运行。至于其他所有唤醒锁,CPU将运行,但是用户使用电源按钮,依然能够将设备置入睡眠状态。
此外,您可以增加两个额外的标志,他们仅影响屏幕的行为,当和PARTIAL_WAKE_LOCK 组合时,没有任何影响,也即无效。
Flag Value | Description |
---|---|
ACQUIRE_CAUSES_WAKEUP |
正常唤醒锁实际上没有亮屏,相反,一旦点亮它们将使屏幕一直亮着(例如:来自user activity) ,当获取到唤醒锁的时候,这个标志将迫使屏幕或键盘立即打开 ,一个典型的使用将是,立即让用户看到的重要通知。 |
ON_AFTER_RELEASE |
如果这个标志被置,当唤醒锁被释放,user activity 定时器将被复位保持屏幕亮稍微长一点,如果您来回循环地切换唤醒锁条件,它可用于减少闪烁。 |
任何使用唤醒锁的应用必须在该应用的manifest 添加“android.permission.WAKE_LOCK
” 权限, 例如:
... ... <uses-permission android:name="android.permission.WAKE_LOCK" /> ... ...
2. PowerManager 类常量定义
一些位控制的私有成员:
private static final int WAKE_BIT_CPU_STRONG = 1;
private static final int WAKE_BIT_CPU_WEAK = 2;
private static final int WAKE_BIT_SCREEN_DIM = 4;
private static final int WAKE_BIT_SCREEN_BRIGHT = 8;
private static final int WAKE_BIT_KEYBOARD_BRIGHT = 16;
private static final int WAKE_BIT_PROXIMITY_SCREEN_OFF = 32;
1)public static final int ACQUIRE_CAUSES_WAKEUP = 0x10000000(268435456);
唤醒锁级别:当获取到唤醒锁的时候点亮屏。
通常唤醒锁实际上不唤醒设备,一旦已经点亮,它们只是使屏幕保持亮着。将视频播放器应用看作正常行为,弹出的通知和想要设备点亮是个例外,使用此标志就是像它们一样。
注: 该标志不能和PARTIAL_WAKE_LOCK一起使用。
唤醒锁级别:确保屏幕和键盘背光全亮.
如果用户按power按钮,FULL_WAKE_LOCK被系统完全释放,使得屏幕和CPU被关,和PARTIAL_WAKE_LOCK截然不同。
多数应用应该使用FLAG_KEEP_SCREEN_ON 替代该类唤醒锁,因为它将被平台正确管理,用户在应用使用中不需要特殊的权限。
3.PowerManager 对外接口方法
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); boolean isScreenOn = pm.isScreenOn();
levelAndFlags
: 指定一个使用“或”运算操作组合的唤醒锁级别和可选标志.
levelAndFlags
参数的一部分。
levelAndFlags
参数的一部分。
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(); // ... do work... wl.release();
使设备从睡眠中唤醒。如果设备当前处于睡眠中,唤醒它,否则不做任何事情。发生在电源键按下亮屏的时候。