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

相关推荐
符哥200810 分钟前
Fastjson2.X 使用详解
android·java
月明泉清17 分钟前
Android中对于点击事件的深度梳理(三)
android
电饭叔24 分钟前
DataFrame和 Series 索引
android·python
lexiangqicheng32 分钟前
【全网最全】React Native 安卓原生工程结构与构建机制深度解析
android·react native·react.js
数据蜂巢1 小时前
MySQL 8.0 生产环境备份脚本 (Percona XtraBackup 8.0+)
android·mysql·adb
jingling5551 小时前
uniapp | 基于高德地图实现位置选择功能(安卓端)
android·前端·javascript·uni-app
fatiaozhang95271 小时前
晶晨S905L/S905LB-通刷-slimbox 9.19-Mod ATV-安卓9-线刷固件包
android·电视盒子·刷机固件·机顶盒刷机
爱怪笑的小杰杰1 小时前
UniApp 桌面应用实现 Android 开机自启动(无原生插件版)
android·java·uni-app
符哥20082 小时前
Fresco2.X 框架完整使用详解(Android Kotlin)
android
TheNextByte12 小时前
如何在Android上恢复已删除的联系人
android