android 休眠锁

首先先简单介绍下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);结束后没有释放造成的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值