Android如何保持后台运行——唤醒锁机制

前言

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

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

使用唤醒锁

首先需要在AndroidManifest.xml中添加权限

复制代码
android.permission.WAKE_LOCK

然后使用PowerManagerService来创建一个唤醒锁,并启用,代码如下:

ini 复制代码
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager 
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "$packageName:wake") 
wakeLock?.acquire()

这样就是激活唤醒锁,cpu就会保持唤醒状态,为了避免不必要的耗电,要在不需要的时候释放唤醒锁

scss 复制代码
wakeLock?.release()

WakeLock的acquire方法还支持传入超时时间,这样当超时的时候就会自动释放唤醒锁,防止出现一直无法释放导致耗电的情况

scss 复制代码
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系统会提示用户高耗电应用,会给自己的用户带来很不好的使用体验。

相关推荐
五月君_1 分钟前
安卓也支持了!微信链接 Claude Code 保姆级教程
android·微信
柚鸥ASO优化3 分钟前
一篇讲透安卓ASO!开发者千万别只盯着iOS了
android·ios·aso优化
木易 士心4 分钟前
compileSdkVersion、minSdkVersion 和 targetSdkVersion —— Android 三个核心的 SDK 版本配置
android
人道领域5 分钟前
为什么iPhone微信聊天记录搜不到“?“,而安卓可以。
android·微信·iphone
火山上的企鹅1 小时前
Codex实战:APP远程升级服务搭建(四)Node 服务端自动识别 APK 信息
android·服务器·git·github·qgc
JohnnyDeng941 小时前
【Android】ViewModelScope 与协程生命周期管理:告别内存泄漏,掌控异步边界
android·kotlin·mvvm·协程
私人珍藏库2 小时前
【Android】瞬净ins版-无水印解析-无水印视频保存
android·app·工具·软件·多功能
Maxwellhang2 小时前
Termux 安装 Claude Code + 配置 DeepSeek API
android·智能手机
百度搜知知学社2 小时前
一键装裱照片,相框APP内置滤镜与贴纸编辑器
android·编辑器·滤镜·图片编辑·贴纸·相框
AFinalStone3 小时前
Android12 U盘插拔链路源码全解析(四):Framework层(上) —— UsbHostManager
android·frameworks