前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android如何保持后台运行——唤醒锁机制

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

作者头像
BennuCTech
发布2023-11-05 12:41:39
6560
发布2023-11-05 12:41:39
举报
文章被收录于专栏:BennuCTechBennuCTech

前言

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

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

使用唤醒锁

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

代码语言:javascript
复制
android.permission.WAKE_LOCK

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

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

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

代码语言:javascript
复制
wakeLock?.release()

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BennuCTech 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档