• 如何使用唤醒锁机制来保持Android程序在后台运行
  • 发布于 2个月前
  • 291 热度
    2 评论
前言
如今在Android上想要保证存活越来越难了,但是Android提供有一个机制——唤醒锁,可以保证cpu一直不休眠,但是代价就是耗电高。这个机制主要是用于一些特别的场景,比如音乐类APP在后台播放音乐,这就需要使用唤醒锁来保证持续播放下去。所以普通APP尽量避免使用这个,当然如果我们自己开发自己使用的小工具或者企业内部使用APP还是可以用的。

下面来看看如何使用这个唤醒锁。

使用唤醒锁
首先需要在AndroidManifest.xml中添加权限
android.permission.WAKE_LOCK
然后使用PowerManagerService来创建一个唤醒锁,并启用,代码如下:
// 堆代码 duidaima.com
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager 
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "$packageName:wake") 
wakeLock?.acquire()
这样就是激活唤醒锁,cpu就会保持唤醒状态,为了避免不必要的耗电,要在不需要的时候释放唤醒锁
wakeLock?.release()
WakeLock的acquire方法还支持传入超时时间,这样当超时的时候就会自动释放唤醒锁,防止出现一直无法释放导致耗电的情况
wakeLock?.acquire(10 * 60 * 1000L)
这样在十分钟后就会自动释放唤醒锁。

level和flag
上面我们使用PowerManagerService的newWakeLock函数来创建唤醒锁,这个函数有两个参数,第二个参数是tag,就是标识这个唤醒锁,是一个自定义的字符串;第一个参数是levelAndFlags,这个很重要,重点说一下。

level
其中level有四种:
PARTIAL_WAKE_LOCK:可以允许屏幕和键盘背景光关闭,CPU一直不休眠
FULL_WAKE_LOCK:当屏幕和键盘背景光都常亮的时候CPU不休眠,如果关闭背景光则释放该锁
SCREEN_DIM_WAKE_LOCK:当屏幕亮起(及屏幕变暗)时CPU不休眠,可以允许键盘背景光关闭。如果关闭屏幕则释放该锁
SCREEN_BRIGHT_WAKE_LOCK:当屏幕亮起(不包括屏幕变暗)时CPU不休眠,可以允许键盘背景光关闭。如果关闭屏幕或屏幕变暗则释放该锁

这四个level只能存在一个,是互斥的。这里涉及到Android设备的休眠过程,如果长时间不使用,则先屏幕变暗,过段时间屏幕关闭,再过段时间CPU关闭。所以上面提到屏幕亮起的时候,会特意提到是否包含屏幕变暗,比如SCREEN_BRIGHT_WAKE_LOCK在屏幕变暗的时候就会释放唤醒锁。

flag
flag有两个:
ACQUIRE_CAUSES_WAKEUP:当激活CPU唤醒锁的时候保持屏幕常亮,不能与PARTIAL_WAKE_LOCK同时使用
ON_AFTER_RELEASE:当释放CPU唤醒锁后,屏幕会保持亮一会,而不是立刻锁屏,同样不能与PARTIAL_WAKE_LOCK同时使用

这里flag不互斥,可以同时设置。
所以levelAndFlags这个参数可以是单独的level,比如“PowerManager.PARTIAL_WAKE_LOCK”;
也可以是“level | flag”这种形式,比如“PARTIAL_WAKE_LOCK |ON_AFTER_RELEASE”;
也可以是“level | flag1 | flag2”这种形式,比如“PARTIAL_WAKE_LOCK | ON_AFTER_RELEASE | ON_AFTER_RELEASE”

总结
最后还是要提醒大家,使用唤醒锁一定注意要释放,否则会导致手机待机时间变短。另外不要滥用这个机制,尤其现在Android系统会提示用户高耗电应用,会给自己的用户带来很不好的使用体验。
用户评论