当前位置:   article > 正文

android 休眠锁_wake locks: size=5

wake locks: size=5

首先先简单介绍下Android的休眠机制,它主要是基于系统的wake_lock机制,只要系统中存在任一有效的wake_lock,系统就无法进入休眠态。wake_lock一般在关闭屏幕时,仍然需要正常运行的情况下使用,比如关闭屏幕后的听歌、传输很大的文件等功能时。同样的,当在系统关闭显示屏幕时,无任何功能业务在后台进行时,还持有wake_lock,那么此时系统耗电比较大,也是不正常的实现过程。所以wakelock在android的电源管理系统中扮演一个非常核心的角色,wakelock其实是一种系统锁的机制, 只要有程序拿着这个锁, android系统就无法进入休眠状态,wake_lock可以设置有超时的或者是没有超时的, 超时的锁会在超时时间过去后自动释放wake_lock。如果整个安卓系统没有wake_lock锁了或者超时释放了wake_lock锁, 那么系统内核就会启动标准linux的那套休眠机制机制来进入休眠。设置安卓系统的wake_lock有两种方法:

1.PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "tag");
获取休眠锁:wakeLock.acquire(30*1000);//设置超时时间,30s后释放休眠锁,30秒亮屏时间;

wakeLock.acquire()一直持有休眠锁
判断是否持有休眠锁,并释放锁:if (wakeLock.isHeld()) {
                   wakeLock.release();}  

2.可使用 FLAG_KEEP_SCREEN_ON 替换WakeLock的方式.
this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//亮屏
this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//灭屏

查看休眠锁的持有情况可以通过adb shell dumpsys power查看:

获取锁的情况:

释放锁的情况:

从上图可以看出获取了锁时Wake Locks size为5;当释放了锁时Wake Locks为0。

以上两种方法都可以获取到休眠锁,但是通过方法2获取的休眠锁,通过adb shell dumpsys power查看休眠锁时,并没有打印出该方法获取的锁的情况。所以写代码时,用方法二解屏显示或者常亮显示时,界面销毁时要记得调用this.getWindow().clearFlags函数。否则当业务结束后,还是很耗电,比较难定位有没有wake_lock被持有。比如上图中业务已经结束了,wake_lock已经为0了,但是系统还是很耗电要经过一段时间才会进入休眠,这个问题就是APP业务发起后this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);结束后没有释放造成的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/301743
推荐阅读
相关标签
  

闽ICP备14008679号