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);
相关推荐
雨白8 小时前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk8 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING9 小时前
RN容器启动优化实践
android·react native
恋猫de小郭12 小时前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Kapaseker17 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴17 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭1 天前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab1 天前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe1 天前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农2 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos