为了延长电池的使用寿命,Android设备会在一段时间后使屏幕变暗,然后关闭屏幕显示,最后停止CPU。WakeLock是一个电源管理系统服务功能,应用程序可以使用它来控制设备的电源状态。

        WakeLock可以用来保持CPU运行,避免屏幕变暗和关闭,以及避免键盘背光灯熄灭。

                        注意:

                        创建和使用Wake Lock会对应用程序造成的电池电量消耗产生显著的影响。因此,最好只在

                       确实有必要时使用Wake Lock,并且使用它们的时间越少越好,只要有可 能就释放它们。

        屏幕Wake Lock通常用于在用户观看屏幕但是很少与屏幕进行交互期间(例如,播放视频)防止屏幕变暗。

        CPU Wake Lock用于防止设备进入休眠状态,直至执行了一个操作。当服务从意图接收器内启动时常常出现这种情况,因为意图接收器可能在设备休眠期间接收意图。值得注意的是,在这种情况下,系统将在广播接收器的整个onReceive处理程序中使用CPU Wake Lock。

                        注意:

                        如果在广播接收器的onReceive处理程序中启动一个服务或广播一个意图,那么有可能在服务

                       启动以前,所使用的Wake Lock就会被释放。为了确保服务能够执行,需要放置一个独立的Wake Lock。

实现步骤:

  1. PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);通过 Context.getSystemService().方法获取PowerManager实例。
  2. 然后通过PowerManager的newWakeLock((int flags, String tag)来生成WakeLock实例。int
    Flags指示要获取哪种WakeLock,不同的Lock对cpu 、屏幕、键盘灯有不同影响。
  3. 获取WakeLock实例后通过acquire()获取相应的锁,然后进行其他业务逻辑的操作,最后使用release()释放(释放是必须的)。

关于flags

各种锁的类型对CPU 、屏幕、键盘的影响:

PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。

SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯

SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,允许保持屏幕高亮显示,允许关闭键盘灯

FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度

ACQUIRE_CAUSES_WAKEUP:Normal wake locks don't actually turn on the illumination. Instead, they cause the illumination to remain on once it turns on (e.g. from user activity). This flag will force the screen and/or
keyboard to turn on immediately, when the WakeLock is acquired. A typical use would be for notifications which are important for the user to see immediately.

ON_AFTER_RELEASE:f this flag is set, the user activity timer will be reset when the WakeLock is released, causing the illumination to remain on a bit longer. This can be used to reduce flicker if you are cycling
between wake lock conditions.

权限获取

要进行电源的操作需要在AndroidManifest.xml中声明该应用有设置电源管理的权限。

<uses-permission android:name="android.permission.WAKE_LOCK" />
你可能还需要
<uses-permission android:name="android.permission.DEVICE_POWER" />

另外WakeLock的设置是 Activiy 级别的,不是针对整个Application应用的。

可以在activity的onResume方法里面操作WakeLock,  在onPause方法里面释放。

例子:

public abstract class WakeLocker {
private static PowerManager.WakeLock wakeLock;
private static final String APP_TAG = "MyWakeLock"; public static void acquire(Context ctx) {
if (wakeLock != null)
wakeLock.release();
/* PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP |
PowerManager.ON_AFTER_RELEASE|
PowerManager.SCREEN_BRIGHT_WAKE_LOCK, APP_TAG);
*/
PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, APP_TAG); wakeLock.acquire();
} public static void release() {
if (wakeLock != null)
wakeLock.release();
wakeLock = null;
}
}
04-13 23:56