PowerManager 介绍
2019-07-14 03:20 发布
生成海报
一、简介
首先通过下面的一张图来了解一下Android 系统中与电源相关的屏幕、键盘的基本状态切换流程
如上图所示,默认情况下,当用户对手机有一段时间没有操作后,手机的Keyboard (这里不仅仅指硬键盘,还包括其他的所有键,比如 Menu) 背光将消失,从 Bright 变为 Off 。如果再过段时间没操作,屏幕( Screen )将从高亮( Bright )变为暗淡( Dim ),如果再过段时间没操作,屏幕( Screen )将又由暗淡( Dim )变为不显示( Off ) , 如果再过段时间没操作 ,CPU 将 sleep, 从 on 变为 off 。而通过 PowerManager 类,我们可以对上述过程进行管理 , 可以让设备到达上面的某种状态时,该状态将不再超时,将不再往下走,但是仍然可以跳到到更上级的某种状态(比如用户有活动,可以让手机回到最高状态)
PowerManager,是 Android 系统为我们提供的一个控制手机电源的操作类。我们可以通过它来控制设备的电源状态。但是使用该 API 会对电池的寿命产生一定影响,所以在使用时应该注意,除非是你是真的需要,否则尽量不要使用 ,使用时应尽可能的使用最低功能级别,使用完成后应该尽快释放资源。
通过Context.getSystemService(Context.POWER_SERVICE)获得PowerManager类的实例。 通过PowerManager的 newWakeLock() 函数来创建一个 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() 必须成对出现。所以在下面的示例中,在 Activity 的 OnResume 和 OnPause 事件中分别进行了请求和释放操作
1) 添加权限
修改 AndroidManifest.xml 配置文件,添加下面 2 个权限:
2) 修改Activity
private WakeLock wakeLock = null;
private PowerManager pm = null;
在Activity 的OnCreate 事件初始化PowerManager 对象
pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock=pm.newWakeLock(PowerManager.FULL_WAKE_LOCK,this.getClass().getCanonicalName());
wakeLock.acquire();
if (wakeLock != null && wakeLock.isHeld()) {
wakeLock.release();
wakeLock = null;
}
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮