Android Manager之PowerManager(电源服务)

简介:

Android系统为我们提供的电源管理的一个API,其相关接口与设备电池的续航能力有很大的关联, 官方也说了,除非是迫不得已吧,不然的话,应该尽量避免使用这个类,并且使用完以后一定要及时释放。所谓的电源管理包括:CPU运行,键盘或者屏幕亮起来!核心其实就是wakelock锁机制,只要我们拿着这个锁, 那么系统就无法进入休眠状态,可以给用户态程序或内核获取到。锁可以是:”有超时的“或者 “没有超时“,超时的锁到时间后会自动解锁,如果没有了锁或超时,内核会启动休眠机制来进入休眠。


PowerManager.WakeLock有加锁与解锁两种状态,而加锁的形式有两种: 

①永久锁住,这种锁除非显式的放开,否则是不会解锁的,所以用起来需要非常小心。

②超时锁,到时间后就会解锁,而创建WakeLock后,有两种加锁机制:

①不计数锁机制,②计数锁机制(默认) 

可通过setReferenceCounted(boolean value)来指定,区别在于: 

前者无论acquire( )多少次,一次release( )就可以解开锁。 

而后者则需要(–count == 0)的时候,同样当(count == 0)才会去申请锁 所以,WakeLock的计数机制并不是正真意义上对每次请求进行申请/释放一个锁; 只是对同一把锁被申请/释放的次数来进行统计,然后再去操作!


android系统在手机屏幕锁定之后一般会让手机休眠,以提高电池的使用时间。但是休眠意味着CPU频率降低,有时候可能需要做一些需要大量运算的任务,所以需要唤醒CPU。WakeLock可以做到这一点。也就是说WakeLock主要用于操作屏幕问题。


使用


1.添加权限




2.代码使用

2.1.获取 WakeLock 对象

private PowerManager.WakeLock mWakeLock;

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);

mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName());


2.2.WakeLock的等级


1.PARTIAL_WAKE_LOCK:保证CPU保持高性能运行,而屏幕和键盘背光(也可能是触摸按键的背光)关闭。一般情况下都会使用这个WakeLock。

2.ACQUIRE_CAUSES_WAKEUP:这个WakeLock除了会使CPU高性能运行外还会导致屏幕亮起,即使屏幕原先处于关闭的状态下。

3.ON_AFTER_RELEASE:如果释放WakeLock的时候屏幕处于亮着的状态,则在释放WakeLock之后让屏幕再保持亮一小会。如果释放WakeLock的时候屏幕本身就没亮,则不会有动作。


2.3.获得WakeLock

mWakeLock.acquire();


2.4.释放WakeLock

mWakeLock.release();


2.5.其他方法

boolean isHeld():

判断是否已经获取WakeLock



void setReferenceCounted(boolean value):

是否使用引用计数。类似于垃圾回收策略,只是把垃圾回收改成了WakeLock回收。如果value是true的话将启用该特性,如果一个WakeLock acquire了多次也必须release多次才能释放掉。但是如果释放次数比acquire多则会抛出RuntimeException("WakeLock under-locked " + mTag)异常。默认是开启了引用计数的!


2.6.PowerManager的几个实用方法


boolean PowerManager::isScreenOn ()判断屏幕是否亮着(不管是暗的dimed还是正常亮度),在API20被弃用,推荐boolean PowerManager::isInteractive ()


void PowerManager::goToSleep(long time)time是时间戳,一般是System.currentTimeMillis()+timeDelay。强制系统立刻休眠,需要Manifest中添加权限"android.permission.DEVICE_POWER"。按下电源键锁屏时调用的就是这个方法。


void PowerManager::wakeUp(long time)与上面对应。参数含义,所需权限与上同。按下电源键解锁屏幕时调用的就是这个方法。


void PowerManager::reboot(String reason)重启手机,reason是要传给linux内核的参数,比如“recovery”重启进recovery模式,“fastboot”重启进fastboot模式。需要权限"android.permission.REBOOT"。


附:

Android Manager之汇总


你可能感兴趣的:(Android,各种Manager)