android 电源管理(PowerManager)

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一起使用。



2). public static final int FULL_WAKE_LOCK =0x0000001a(WAKE_BIT_CPU_WEAK | WAKE_BIT_SCREEN_BRIGHT |WAKE_BIT_KEYBOARD_BRIGHT =26);

唤醒锁级别:确保屏幕和键盘背光全亮.

如果用户按power按钮,FULL_WAKE_LOCK被系统完全释放,使得屏幕和CPU被关,和PARTIAL_WAKE_LOCK截然不同。

多数应用应该使用FLAG_KEEP_SCREEN_ON 替代该类唤醒锁,因为它将被平台正确管理,用户在应用使用中不需要特殊的权限



3). public static final int ON_AFTER_RELEASE = 0x20000000;

 唤醒锁级别:当该锁被释放,将触发user activity定时器,因此屏幕会再亮一会。如果屏幕没有点亮,将不会亮屏。


4). public static final int PARTIAL_WAKE_LOCK = WAKE_BIT_CPU_STRONG;

 唤醒锁级别: 确保CPU正在运行,屏幕和键盘允许off 。

如果用户按下power 按钮,将灭屏但是CPU保持运行,直到所有的PARTIAL_WAKE_LOCK 锁都被release。


5). public static final int SCREEN_BRIGHT_WAKE_LOCK = WAKE_BIT_CPU_WEAK | WAKE_BIT_SCREEN_BRIGHT;

唤醒锁级别: 确保屏幕全亮,键盘的背光允许关掉。如果用户按下power键,SCREEN_BRIGHT_WAKE_LOCK将被系统完全释放,使得屏幕和CPU被关。

多数应用应该使用FLAG_KEEP_SCREEN_ON 替代该类唤醒锁, 因为它将被平台正确管理,用户在应用使用中不需要特殊的权限。
 

6). public static final int SCREEN_DIM_WAKE_LOCK = WAKE_BIT_CPU_WEAK | WAKE_BIT_SCREEN_DIM;

唤醒锁级别:确保屏幕点亮(但是可能是暗淡的),键盘背光允许被关。
多数应用应该使用FLAG_KEEP_SCREEN_ON 替代该类唤醒锁, 因为它将被平台正确管理,用户在应用使用中不需要特殊的权限。

如果用户按下power键,该锁将被系统release,使得屏幕和CPU都被关。跟PARTIAL_WAKE_LOCK截然不同。

3.PowerManager 对外接口方法


1) .public void goToSleep(long time)

迫使设备进入睡眠。持有所有唤醒锁,当power键按下的时候灭屏。
需要DEVICE_POWER( android.permission.DEVICE_POWER)权限。

参数:time

是以uptimeMillis()为时间基准,请求睡眠时的时间,这个时间戳被用来和其他电源管理功能一起正确排序睡眠请求。应该设置睡眠请求输入事件的时间戳。


2). public boolean isScreenOn()

返回当前屏幕是否点亮。

仅仅表示是否屏幕点亮,要不是全亮(bright)要不就是暗淡亮(dim)。

用法:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
 boolean isScreenOn = pm.isScreenOn();


3).public PowerManager.WakeLock newWakeLock(int flags, String tag)

使用指定的级别和标志创建新的唤醒锁

参数:

levelAndFlags : 指定一个使用“或”运算操作组合的唤醒锁级别和可选标志.

唤醒锁所有级别如下:

PARTIAL_WAKE_LOCK
FULL_WAKE_LOCK
SCREEN_DIM_LOCK
SCREEN_BRIGHT_WAKE_LOCK

这些唤醒锁级别中某个唤醒锁必须被明确地指定为 levelAndFlags参数的一部分。

唤醒锁标志如下:
ACQUIRE_CAUSES_WAKEUP
ON_AFTER_RELEASE

这些标志组合成为 levelAndFlags参数的一部分。

调用acquire()获取唤醒锁,当完成的时候调用release()释放唤醒锁。

用法:

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();

尽管在没有指定权限的条件下唤醒锁能够被创建,但是返回的唤醒锁在实际acquire和release时需要WAKE_LOCK( android.permission.WAKE_LOCK)权限。如果使用它去保持亮屏,强烈推荐考虑使用FLAG_KEEP_SCREEN 替代它,这个windows标志能够被平台正确管理,在应用中不需要特殊的权限。

4).public void reboot(String reason)

重启设备,如果重启成功不会返回。需要REBOOT( android.permission.REBOOT)权限。

参数:reason

传给Kernel请求指定boot 模式的码(例如:“recovery”)或 null。


5).public void userActivity(long when, boolean noChangeLights)


用户行为(user activity)发生通知电源管理。
当一个键或触摸屏被按下或者一些其他用户行为发生,如果设备没有进入睡眠模式,复位自动关机定时器点亮屏幕。 如果设备已进入睡眠模式,该方法不会唤醒设备。

需要DEVICE_POWER ( android.permission.DEVICE_POWER)权限。

参数:

when: 用户行为时间,以uptimeMillis()为时间基准,这个时间戳被用来和其他电源管理功能正确排序用户行为请求。应该设置用户行为输入事件的时间戳。

noChangeLights : 如果设置成true ,键盘背光不会因为该事件打开。当power键被按下的时候被置,我们想要这设备常亮而按键关掉,但是我们希望灭屏因此我们不想键盘背光再次打开,否则将会闪屏,看上去很奇怪。

6). public void wakeUp(long time)


使设备从睡眠中唤醒。如果设备当前处于睡眠中,唤醒它,否则不做任何事情。发生在电源键按下亮屏的时候。


需要DEVICE_POWER ( android.permission.DEVICE_POWER)权限。

参数:time

请求唤醒的时间,以uptimeMillis()为时间基准。该时间戳被用于和其他电源管理功能正确地排序唤醒请求。应该设置唤醒请求输入事件的时间戳



你可能感兴趣的:(android 电源管理(PowerManager))