Android之唤醒锁定

唤醒锁定简称唤醒锁。 它可以让CPU持续处于唤醒状态,CPU无法进入休眠。 该机制比较耗电,但是在一些场景上必须用到,比如:MP3在后台播放,即使屏幕长时间熄灭也需要播放。 Android的唤醒锁接口为:PowerManager.WakeLock

(1)基本使用

ini 复制代码
    // 创建电源管理类
    PowerManager manager = (PowerManager) getSystemService(Service.POWER_SERVICE);
    // 创建唤醒锁
    PowerManager.WakeLock wakeLock =  manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "AA");
    // 获得唤醒锁
    wakeLock.acquire();

当需要释放唤醒锁时,应该即使释放,防止耗电增加

scss 复制代码
    // 释放锁
    wakeLock.release();

(2)锁超时机制

java 复制代码
public void acquire(long timeout)

申请锁时,尽量设置超时时间,防止锁一直无法释放。

(3)权限

申请唤醒锁时,必须添加唤醒锁权限:

ini 复制代码
<uses-permission android:name="android.permission.WAKE_LOCK" />

(4)唤醒锁级别

在创建唤醒锁时,需要传入levelAndFlags

arduino 复制代码
public WakeLock newWakeLock(int levelAndFlags, String tag)

levelAndFlags的选择有:

less 复制代码
PowerManager.PARTIAL_WAKE_LOCK:
​
    唤醒锁级别:确保CPU正在运行;屏幕和键盘 背光熄灭。 
    如果用户按下电源按钮,那么屏幕将会被关闭,但是CPU将一直保持着,直到所有唤醒锁被释放。
​
PowerManager.SCREEN_DIM_WAKE_LOCK:
​
    已废弃,不管它。
​
PowerManager.SCREEN_BRIGHT_WAKE_LOCK:
​
    已废弃,不管它。
​
PowerManager.FULL_WAKE_LOCK:
​
    已废弃,不管它。
​
PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
​
    唤醒锁定级别:当接近传感器激活时,关闭屏幕。 
    如果接近传感器检测到附近有物体,屏幕将立即关闭,但CPU会保持唤醒。在物体移动后不久,屏幕再次打开。
​
PowerManager.DOZE_WAKE_LOCK:
​
    唤醒锁级别:使屏幕处于低功耗状态,如果没有其它锁,那么允许CPU暂停。
    它已被{@hide}标识,不对外开放。
​
PowerManager.DRAW_WAKE_LOCK:
​
    唤醒锁级别:保持设备足够清醒,以便进行绘制。 
    它已被{@hide}标识,不对外开放。

(5)是否保持唤醒锁

java 复制代码
public boolean isHeld()

如果已经持有唤醒锁,但是没有释放,那么返回true,否则返回false;

(6)设置与唤醒锁关联的工作源

java 复制代码
public void setWorkSource(WorkSource ws) 
​
工作源用于确定唤醒锁代表哪个应用程序。
这在服务代表应用程序执行工作的情况下很有用,以便该工作的成本可以计入应用程序。 
确保在使用工作源时遵循标记命名约定,使应用程序开发人员更容易理解属于他们的唤醒锁。

(7)释放带有标志的唤醒锁

java 复制代码
public void release(int flags)
​
释放带有标志的唤醒锁,以修改释放行为。 此方法将释放您对正在打开的cpu或屏幕的声明。
屏幕可能会在你释放尾锁后不久关闭,如果还有其他锁,屏幕可能不会关闭。
​
使用标志值的组合来修改释放唤醒锁的行为,但是当前只支持RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY。

(8)唤醒锁的计数机制

java 复制代码
public void setReferenceCounted(boolean value)

默认情况下,唤醒锁是计数的。 如果唤醒锁计数,那么wakeLock.acquire()的调用数量要和wakeLock.release()的调用数量相同; 如果唤醒锁不计数,那么主要调用一次wakeLock.release()就可以释放所有的唤醒锁了;

所以,为了保证唤醒锁完全释放,可以设置为不计数模式

arduino 复制代码
    wakeLock.setReferenceCounted(false);
相关推荐
H1001 小时前
重构(二)
android·重构
拓端研究室1 小时前
R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别
android·开发语言·kotlin
zhangphil2 小时前
Android简洁缩放Matrix实现图像马赛克,Kotlin
android·kotlin
m0_512744642 小时前
极客大挑战2024-web-wp(详细)
android·前端
lw向北.2 小时前
Qt For Android之环境搭建(Qt 5.12.11 Qt下载SDK的处理方案)
android·开发语言·qt
不爱学习的啊Biao2 小时前
【13】MySQL如何选择合适的索引?
android·数据库·mysql
Clockwiseee3 小时前
PHP伪协议总结
android·开发语言·php
mmsx9 小时前
android sqlite 数据库简单封装示例(java)
android·java·数据库
众拾达人12 小时前
Android自动化测试实战 Java篇 主流工具 框架 脚本
android·java·开发语言
吃着火锅x唱着歌13 小时前
PHP7内核剖析 学习笔记 第四章 内存管理(1)
android·笔记·学习