Android中的WakeLock使用

    xiaoxiao2021-12-10  50

    转载:http://landerlyoung.github.io/blog/2014/10/31/androidzhong-de-wakelockshi-yong/

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

    WakeLock的创建是:

    1 2 3 4 5 PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); Wakelock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");

    另外如果要使用WakeLock需要在Manifest中添加如下权限

    <uses-permission android:name="android.permission.WAKE_LOCK" />

    WakeLock的等级

    上面的第一个参数是WakeLock levelAndFlag,分别代表了一种WakeLock等级,并且可以通过「或」位操作组合使用。他们是:

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

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

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

    弃用的WakeLock:

    SCREEN_DIM_WAKE_LOCK:保证屏幕亮起,但是亮度可能比较低。同时键盘背光也可以不亮。

    SCREEN_BRIGHT_WAKE_LOCK :保证屏幕全亮,同时键盘背光也亮。

    FULL_WAKE_LOCK:表现和SCREEN_BRIGHT_WAKE_LOCK 类似,但是区别在于这个等级的WakeLock使用的是最高亮度

    这三个Level在API17被弃用。被弃用说明肯定有替代品吗,上面三个类型的作用无非就是保持屏幕长亮。所以推荐是用WindowFlagWindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON。使用方法是:

    在Activity中: getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    甚至可以在布局中添加这个属性:android:keepScreenOn="true"

    隐藏的WakeLock:

    android中的部分api并不对用户应用开放,他们通过在注释中加入{@hide}来注明。但是在SDK提供的源代码中是可以看到的。

    WAIT_FOR_PROXIMITY_NEGATIVE:用于和接近传感器配合使用,来实现电话应用中打电话时可以使屏幕黑掉,手机离开时又能使屏幕亮起来的功能。acqure的时候屏幕会暗下来,release之后屏幕会亮。其值是32(int)。虽然被hide起来,但是感觉这个超实用的好吗!!!为啥要hide起来。。。「话说在API21 上终于开放了(开放这么晚有个屁用啊(╯‵□′)╯︵┻━┻)」经试验,不过newWakeLock的时候flag直接用32代替是可以创建这个等级的WakeLock的,但是因为是非开放API,不能保证第三方OEM修改这个代码实现!因此使用起来并不安全。「说的好像开放的API第三方OEM就不会乱改一样。。。(╯‵□′)╯︵┻━┻」

    WakeLock的使用:

    获取WakeLock:

    void acquire():获得WakeLock

    void acquire(long timeOut):获得WakeLock timeOut时长,当超过timeOut之后系统自动释放WakeLock。

    释放WakeLock:release()

    判断是否已经获取WakeLock:boolean isHeld()

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

    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"。

    转载请注明原文地址: https://ju.6miu.com/read-700047.html

    最新回复(0)