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);
相关推荐
STCNXPARM1 小时前
Android camera之硬件架构
android·硬件架构·camera
2501_944525543 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 支出分析页面
android·开发语言·前端·javascript·flutter
松☆4 小时前
Dart 核心语法精讲:从空安全到流程控制(3)
android·java·开发语言
_李小白6 小时前
【Android 美颜相机】第二十三天:GPUImageDarkenBlendFilter(变暗混合滤镜)
android·数码相机
小天源8 小时前
银河麒麟 V10(x86_64)离线安装 MySQL 8.0
android·mysql·adb·麒麟v10
2501_915921438 小时前
傻瓜式 HTTPS 抓包,简单抓取iOS设备数据
android·网络协议·ios·小程序·https·uni-app·iphone
csj5010 小时前
安卓基础之《(20)—高级控件(2)列表类视图》
android
JMchen12310 小时前
Android计算摄影实战:多帧合成、HDR+与夜景算法深度剖析
android·经验分享·数码相机·算法·移动开发·android-studio
恋猫de小郭11 小时前
Flutter 在 Android 出现随机字体裁剪?其实是图层合并时的边界计算问题
android·flutter·ios
2501_9159184111 小时前
把 iOS 性能监控融入日常开发与测试流程的做法
android·ios·小程序·https·uni-app·iphone·webview