Android之PowerManager电源管理

2019-07-13 23:05发布

翻译来源PowerManager

这个类让你拥有控制设备状态的权利。

使用这个api类会很明显地影响设备电量的使用时长。除非你确实需要PowerManager.WakeLock否则不要轻易使用它们,并尽量使用低等级功能,并确保在你不使用它们的时候立即释放PowerManager.WakeLock。
你可以通过使用Context.getSystemService来获取这个类的实例。
你会使用到的最主要API就是newWakeLock()。这个方法会实例化一个PowerManager.WakeLock实例,你可以用WakeLock的方法去控制设备的电量状态。
实际使用十分简单: PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag"); wl.acquire(); ..screen will stay on during this section.. 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_WAKE_LOCK的锁,CPU会一直保持运行状态,哪怕屏幕展示时间超时甚至用户手动点击电源按钮锁屏也无法改变CPU运行状态。而在其他三个状态的锁下,CPU虽然会运行,但当用户使用电源按钮时,CPU还是会陷入休眠状态。 另外,你可以增加两个只会影响屏幕状态的标志。这两个标志和PARTIAL_WAKE_LOCK结合使用没有任何影响。 Flag Value Description ACQUIRE_CAUSE_WAKEUP 正常情况下,锁并不会打开屏幕照明功能,事实上,它们只是在屏幕
被点亮(比如在Activity中)时让它保持照明功能,但如果你使用这个
标签,当你获得锁时就会立刻将屏幕和键盘状态打开。一个传统的使
用该功能就是在需要用户立马看到屏幕和键盘的通知时使用这个标签
ON_AFTER_RELEASE 如果这个标签被使用,activity计时器会在锁被释放的时候重置,使得
屏幕照明时间延长。这个标签可以用来当你在各种锁状态切换过程中
减少闪烁。


任何使用WakeLock的程序都必须在应用的mainfiest中声明android.permission.WAKE_LOCK权限!
常量 public static final int ACQUIRE_CAUSES_WAKEUP 当获取锁时将屏幕亮度打开。 正常情况下锁并不会唤醒设备,它们只是让已经开启的屏幕状态保持唤醒状态。就像视频播放应用软件正常情况下位播放视频,只有当弹出通知或设备需要唤醒才属于例外情况,用这个标签就是这个用法。 这个常量不能和PARTIAL_WAKE_LOCK一同使用 public static final int FULL_WAKE_LOCK 这个常量在API 17中不能使用 大部分应用都使用FLAG_KEEP_SCREEN_ON代替这个锁,因为FLAG_KEEP_SCREEN_ON 可以在用户切换应用程序的过程中正确地被系统所管理,且不需要特殊权限。 锁的等级:保证屏幕和键盘背景灯都常亮。 如果永和按下电源键,FULL_WAKE_LOCK锁将被系统直接释放掉,导致屏幕和CPU都进入休眠状态,和PARTIAL_WAKE_LOCK相反 public static final int ON_AFTER_RELEASE 当这个锁释放的时候,引起主activity计时器归零使得屏幕可以保持唤醒状态更长时间。 在屏幕没有进入唤醒状态前将无法打开屏幕,如果你想要随时可以让屏幕唤醒,请查阅ACQUIRE_CAUSE_WAKEUP。 不能和PARTIAL_WAKE_LOCK一同使用。 public static final int PARTIAL_WAKE_LOCK 保证CPU处于运行状态,且屏幕和键盘背景光可以消失。 如果用户按下电源键,屏幕将睡眠但CPU扔保持运行直到所有的PARTIAL_WAKE_LOCK被释放。 public static final int SCRREN_BRIGHT_WAKE_LOCK 这个常量在API 13中无法使用 大部分应用都应该使用FLAG_BRIGHT_WAKE_LOCK代替这个,因为FLAG_BRIGHT_WAKE_LOCK能保证用户在应用程序间切换时该锁无法被系统正常控制且需要特殊权限。 public static final int SCREEN_DIM_WAKE_LOCK 这个常量在API 17中无法使用 大部分应用程序都应该使用FLAG_KEEP_SCREEN_ON代替这个锁,因为FLAG_KEEP_SCREEN_ON可以在用户在不同应用程序间切换时合理地被系统操控并且不需要特殊权限。 这个常量保证屏幕处于运行态(可能屏幕微亮),键盘背景光允许关闭。 如果用户按下电源键,SCREEN_DIM_WAKE_LOCK类型的锁将被系统释放,使得屏幕和CPU都进入休眠状态,和PARTIAL_WAKE_LOCK相反。 public方法 public void goToSleep(long time) 强制设备进入休眠状态。 覆盖所有持有的锁。这个方法在按下电源键来关闭屏幕时会被调用。 需要DEVICE_POWER权限 参数 time 响应睡眠请求的时间长度,以uptimeMillis()为时间基点。这个时间戳用来将睡眠功能与其他电源功能合理安排使用。它将被设置到引起睡眠的时间戳中。 public boolean isScreenOn() 判断当前屏幕是否处于运行态 只用来判断屏幕是否在运行,屏幕可能明亮也可能微亮。 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); boolean isScreenOn = pm.isScreenOn();
public PowerManager.WakeLock newWakeLock(int levelAndFlags, String tag) 新建一个特定类型的锁 levelAndFlag参数用来设定锁类型,并且可以通过逻辑运算符| 来结合各种不同类型的标签 锁的类型有PARTIAL_WAKE_LOCK, FULL_WAKE_LOCK, SCREEN_DIM_WAKE_LOCK SCREEN_BRIGHT_WAKE_LOCK。至少一个锁类型并需定义到levelAndFlag参数中 如果锁的类型是ACQUIRE_CAUSE_WAKEUP或者ON_AFTER_RELEASE。各种标签可以结合到levelAndFlag参数中。 使用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();
虽然一个锁可以在没有任何权限的情况下创建,但要获取或者释放锁都WAKE_LOCK权限。 如果需要用锁来保持屏幕一直处于运行状态,最好使用FLAG_KEEP_SCREEN__ON标签,因为这个标签能在用户在不同应用程序间切换的时候被系统正常控制并且不需要特殊权限。 参数  levelAndFlag 根据实际使用情况来设置的锁功能和标签的结合 tag 用来编译用的类名(获其他标识)
public void reboot(String reason) 重启设备,即使重启成功也不会有返回值 需要REBOOT权限 参数  reason 发送给内核的指令(如“recovery”)来让内核执行特定开机模式,也可以是null
public void userActivity(long when, boolean noChangeLights) 通知电源管理用户activity开启了 重置自动计时器并且如果设备没有进入睡眠状态点亮屏幕。这个方法在又按键或者屏幕被按下,或者其他的用户activity开启。这个方法并不会唤醒已经进入休眠状态的设备。 需要DEVICE_POWER权限 参数  when 用户activity以uptimeMillis()时间为基准的时间。这个时间戳用来将睡眠功能与其他电源功能合理安排使用。它将被设置到引起睡眠的时间戳中。 noChangeLights 如果为true,这个方法不会打开键盘背景灯。这个方法在按下电源键的时候启用。我们想在按下电源键的时候保持设备运行,但我们想要关闭屏幕因此我们不需要键盘背景灯亮起,否则会有闪烁的光。
public void wakeUp(long time) 强制让设备从睡眠到唤醒 如果设备当前正在睡眠状态,唤醒设备,否则什么也不做。这个方法在按下电源键来开启屏幕的时候会被使用。、 需要DEVICE_POWER权限。 参数  time 唤醒时间执行的时间,以uptimeMillis()为基准。这个时间戳用来将睡眠功能与其他电源功能合理安排使用。它将被设置到引起睡眠的时间戳中。