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);结束后没有释放造成的。
更多推荐
所有评论(0)