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

前言

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

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

使用唤醒锁

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

android.permission.WAKE_LOCK

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

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

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
img
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓(文末还有ChatGPT机器人小福利哦,大家千万不要错过)

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题
图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值