【转】PowerManager 与 WakeLock

摘要:
您可以在activity_KEEP_SCREEN_ON中使用FLAG。唤醒锁更可能用于后台服务。CPU在休眠前运行以完成某些任务,例如下载或MP3播放。官方文件还指出,唤醒锁从未在活动中使用,
PowerManager 与 WakeLock

PowerManager 用来控制设备的电源状态. 而PowerManager.WakeLock 也称作唤醒锁, 是一种保持 CPU 运转防止设备休眠的方式.

我们经常需要应用保持高亮, 比如看小说. 或者即使屏幕关闭后台也能保持运行, 比如播放MP3. 这里就需要使用 PowerManager 的 WakeLock 机制.

如果只是需要保持屏幕开启, 比如阅读器应用或者游戏, 可以在 activity 中使用 FLAG_KEEP_SCREEN_ON. 唤醒锁更加倾向于后台服务, 运转 CPU 在休眠之前完成某些特定任务. 比如下载或者mp3播放.

官方文档里也说明了在 activity 里从不使用唤醒锁, 只使用 FLAG_KEEP_SCREEN_ON.

四种唤醒锁

PowerManager.WakeLock 提供了四种唤醒锁. 但是除了 PARTIAL_WAKE_LOCK 其余都已经在 API level 17 中 deprecated了. 所以尽量只考虑在服务中使用 PARTIAL_WAKE_LOCK, 在 activity 中使用 FLAG_KEEP_SCREEN_ON.

Flag ValueCPU屏幕键盘
PARTIAL_WAKE_LOCKOn*OffOff
SCREEN_DIM_WAKE_LOCKOnDim 逐渐变暗Off
SCREEN_BRIGHT_WAKE_LOCKOnBright 保持亮度Off
FULL_WAKE_LOCKOnBright 保持亮度Bright 保持亮度

请注意, 如果是 PARTIAL_WAKE_LOCK, 无论屏幕的状态甚至是用户按了电源钮, CPU 都会继续工作. 如果是其它的唤醒锁, 设备会在用户按下电源钮后停止工作进入休眠状态.

除了上面四种唤醒锁, 还有两种只关乎屏幕显示方式的 flags

Flag Value描述
ACQUIRE_CAUSES_WAKEUP一旦获得唤醒锁锁时,屏幕和键盘会立即强制打开
ON_AFTER_RELEASE释放唤醒锁时 activity timer 会被重置, 屏幕将比平时亮的久一点

如何使用

首先必须要有使用唤醒锁的权限

<uses-permission android:name="android.permission.WAKE_LOCK" />

可能还需要:

<uses-permission android:name="android.permission.DEVICE_POWER"/>

在这之前, 请考虑能否使用 WakefulBroadcastReceiver (参考 WakefulBroadcastReceiver 笔记). 它会自动获得 PARTIAL_WAKE_LOCK 唤醒锁.

如果不符合情况则手动创建唤醒锁.

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);

// 创建唤醒锁
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");

// 获得唤醒锁
wakeLock.acquire();

// 进行一些后台服务
....

// 释放唤醒锁, 如果没有其它唤醒锁存在, 设备会很快进入休眠状态
wakelock.release();

这里要尽量使用 acquire(long timeout) 设置超时, (也被称作超时锁). 例如网络请求的数据返回时间不确定, 导致本来只需要10s的事情一直等待了1个小时, 这样会使得电量白白浪费了. 设置超时之后, 会自动释放已节省点远.

WakeLock 的两种模式

  • 不计数锁模式
  • 计数锁模式

通过 setReferenceCounted(boolean value) 来指定. true 计数, false 不计数. 默认为计数机制.

  • 如果是不计数模式, 不论之前 acquire() 了多少次, 调用一次 release() 就会释放所有锁.
  • 如果是计数模式, 每次调用 acquire() 都会计数 count++, release() 的时候 count 的值必须相同.

参考



作者:ChuanDong
链接:https://www.jianshu.com/p/48ed37738a9e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

免责声明:文章转载自《【转】PowerManager 与 WakeLock》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇RHEL6下squid代理之正向代理 枯木技术分享:逆向海盗船k95机械键盘下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

前端解决移动端适配的五种方法

移动端适配的五种方法所谓移动端适配,就是WebApp在不同尺寸的屏幕上等比显示 推荐: 1.使用rem单位来做网页适配,这个是我比较推荐的一种,效果很好,浏览器的兼容性也不错 只要一行代码就能适配多个分辨率终端  (function(doc,win){ var docEl =doc.documentElement,...

如何在ubuntu下安装xampp

安装前置工作,到这里下载xampp for Linux。下载后,把它放在你的主文件夹中,比如我的是“root@ubuntu:/home/roy”,也就是我的主文件夹。路径不对,执行下面程序时会提示你错误的哦,比如提示“没有那个文件或目录”什么的。大家都是明白人。1、首先主面板下搜索“终端”,或者你可以直接按下Ctrl+Alt+T,启动终端。 2、进入终端...

AirtestIDE高级功能

本篇文章基于AirtestIDE1.2.9 前期回顾: AirtestIDE基本功能(一) AirtestIDE基本功能(二) 一、图片编辑器 双击代码编辑区里的图片,就可以打开该图片的编辑界面 Snapshot+Recognition 点击左上按钮,对当前手机屏幕截图,并识别图片是否在截图中,识别到后会红圈标出,并在左下显示识别方法和可信度 filen...

【转】获取屏幕分辨率及大小相关

vc得到屏幕的当前分辨率方法:1.Windows API调用int width = GetSystemMetrics ( SM_CXSCREEN ); int height= GetSystemMetrics ( SM_CYSCREEN ); 如果想动态自适应分辨率的变化,处理WM_DISPLAYCHANGE消息. 2.获得分辨率BOOL EnumDisp...

Android实现简单的检测手机自由落体关闭屏幕

实现功能如下:在背景运行app,检测到自由落体状态时,熄灭屏幕,可重复测试。 1. 检测自由落体动作  需要使用到加速度感应器 TYPE_ACCELEROMETER SensorManager mSensorManager; private float mLastX; private float mLastY; private float mLastZ;...

Redis集群实现分布式锁-RedLock

一、redis集群分布式锁 Redis单节点实现分布式锁 ,如果通过sentinel保证高可用,如果master节点由于某些原因发生了主从切换,那么就会出现锁丢失的情况: 1. 客户端1在Redis的master节点上拿到了锁。 2. Master宕机了,存储锁的key还没有来得及同步到Slave上。 3. master故障,发生故障转移,slave节点升...