PowerManager 介绍

2019-07-14 03:20发布

一、简介 首先通过下面的一张图来了解一下Android系统中与电源相关的屏幕、键盘的基本状态切换流程
        如上图所示,默认情况下,当用户对手机有一段时间没有操作后,手机的Keyboard(这里不仅仅指硬键盘,还包括其他的所有键,比如Menu)背光将消失,从Bright变为Off。如果再过段时间没操作,屏幕(Screen)将从高亮(Bright)变为暗淡(Dim),如果再过段时间没操作,屏幕(Screen)将又由暗淡(Dim)变为不显示(Off,如果再过段时间没操作,CPUsleep,on变为off。而通过PowerManager类,我们可以对上述过程进行管理,可以让设备到达上面的某种状态时,该状态将不再超时,将不再往下走,但是仍然可以跳到到更上级的某种状态(比如用户有活动,可以让手机回到最高状态)         PowerManager,是Android系统为我们提供的一个控制手机电源的操作类。我们可以通过它来控制设备的电源状态。但是使用该API会对电池的寿命产生一定影响,所以在使用时应该注意,除非是你是真的需要,否则尽量不要使用,使用时应尽可能的使用最低功能级别,使用完成后应该尽快释放资源。         通过Context.getSystemService(Context.POWER_SERVICE)获得PowerManager类的实例。 通过PowerManagernewWakeLock()函数来创建一个PowerManager.WakeLock对象,这时就可以通过WakeLock对象的函数来控制电源状态。实际上操作十分简单:        系统通过定义如下几个标识,分别对系统电源产生不同的影响。这些标识是互斥的,你只能选择它们其中的一种,如下所示: Flag Value
CPU
Screen
Keyboard
PARTIAL_WAKE_LOCK
On*
Off
Off
SCREEN_DIM_WAKE_LOCK
On
Dim
Off
SCREEN_BRIGHT_WAKE_LOC
On
Bright
Off
FULL_WAKE_LOCK
On
Bright
Bright         如果你hold了一个partial wakelock,那么CPU将一直运行,甚至在用户按下电源按钮。 对于其他的wakelocks,那么CPU将继续运行,但是用户可以通过按下电源按钮来停止CPU的运行。        另外,可以增加两个只会影响屏幕状态的标志,这两个标志和PARTIAL_WAKE_LOCK.组合时没任何影响               Flag Value            描述
                                                                                           ACQUIRE_CAUSES_WAKEUP                                                                                                                                                                                        
正常情况下,锁并不会打开屏幕照明功能,事实上,它们只是在屏幕被点亮(比如在Activity中)时让它保持照明功能,但如果你使用这个标签,当你获得锁时就会立刻将屏幕和键盘状态打开。一个传统的使用该功能就是在需要用户立马看到屏幕和键盘的通知时使用这个标签
ON_AFTER_RELEASE
如果这个标签被使用,activity计时器会在锁被释放的时候重置,使得屏幕照明时间延长。这个标签可以用来当你在各种锁状态切换过程中减少闪烁
二、示例     下面的示例演示了如何将电源状态设置为PARTIAL_WAKE_LOCK,其它状态设置流程大体一致     另外需要注意的是,操作WakeLock对象时,wakeLock.acquire()wakeLock.release()必须成对出现。所以在下面的示例中,在ActivityOnResumeOnPause事件中分别进行了请求和释放操作     1) 添加权限     修改AndroidManifest.xml配置文件,添加下面2个权限:     2) 修改Activity
  • 声明全局变量
private WakeLock wakeLock = null; private PowerManager pm = null;
  • ActivityOnCreate事件初始化PowerManager对象
pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
  • ActivityOnResume事件中设置
wakeLock=pm.newWakeLock(PowerManager.FULL_WAKE_LOCK,this.getClass().getCanonicalName()); wakeLock.acquire();
  • ActivityOnPause事件中释放
if (wakeLock != null && wakeLock.isHeld()) { wakeLock.release(); wakeLock = null; }