【转】PowerManager 与 WakeLock
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 Value | CPU | 屏幕 | 键盘 |
|---|---|---|---|
| PARTIAL_WAKE_LOCK | On* | Off | Off |
| SCREEN_DIM_WAKE_LOCK | On | Dim 逐渐变暗 | Off |
| SCREEN_BRIGHT_WAKE_LOCK | On | Bright 保持亮度 | Off |
| FULL_WAKE_LOCK | On | Bright 保持亮度 | 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的更多相关文章
- PowerManager和WakeLock的操作步骤
① PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);通过 Context.getSystemServ ...
- Android -- PowerManager和PowerManager.WakeLock
PowerManager.WakeLock PowerManager.WakerLock是我 ...
- PowerManager.WakeLock
PowerManager.WakeLock PowerManager.WakerLock是我分析Standup Timer源代码时发现的一个小知识点,Standup Timer 用WakeLock保证 ...
- PowerManager和PowerManager.WakeLock详解
最近在做项目过程中,有一个LocalPush的需求,需要保持屏幕点亮一段时间,并且在这个时间里,启动Service来执行请求服务器的操作,拿到热点的数据.所以,就找了一下相关的android开源项目. ...
- Android之PowerManager&BatteryManager
PowerManager是Android平台中用于管理控制设备电源状态.重启.休眠状态.唤醒等,使用该API会影响到电池的待机时间,所以无非必要,一般不要使用. 在PowerManager中有几个比较 ...
- Android 电源管理 -- wakelock机制
转载地址:http://blog.csdn.net/wh_19910525/article/details/8287202 Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠, ...
- Android 常用的常量
常用的Android常量 1.Activity Action 字符串常量("android.intent.action."+) 描述ALL_APPS ...
- Android实例-屏幕操持常亮(XE8+小米2)
相关资料: http://www.bubuko.com/infodetail-163304.html 结果: 1.打开权限Wake lock为True. 第三方单元: unit Android.JNI ...
- LongLightUtils【保持屏幕常亮工具类】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这里只是简单记录下保持屏幕常亮工具类LongLightUtils的使用,具体请阅读参考资料<Android屏幕常亮,其实很简单 ...
随机推荐
- gson如何转化json数组
String.JsonObject.JavaBean 互相转换 User user = new Gson().fromJson(jsonObject, User.class); User user = ...
- react native与原生的交互
一.交互依赖的重要组件 react native 中如果想要调用ios 中相关的方法,必须依赖一个重要的组件nativemodules import { NativeModules } from ' ...
- windwo访问linux文件夹方法
windwo访问linux文件夹:是通过linux的samba来实现的: 安装samba需要安装samba-client.samba-common.smaba3个包. 一:安装rpm 现有一个服务器l ...
- 设置Tomcat的jvm内存问题
tomcat的jvm大小设置与操作系统以及jdk有关:具体来说: 1.操作系统是32bit的,程序最大内存访问空间是4G, 2的32次方,这是硬件决定的,跟windows linux没有任何关系. 2 ...
- Python(1)(安装与基本使用)
1.Python的下载和安装我就不废话了,百度上都有. 我安装的是Python 3.4.3 64bit 安装完之后,打开Cmd,输入Python 显示以上相同,按照百度的意思就是安装成功. 2.配置环 ...
- 书写优雅的shell脚本(四) - kill命令的合理使用
Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须 ...
- 奶牛排序——RMQ
[问题描述]奶牛在熊大妈的带领下排成了一条直队.显然,不同的奶牛身高不一定相同……现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛 A 是最矮的,最右边的 B 是最高的,且 B 高于 A ...
- javacv开发详解之1:调用本机摄像头视频(建议使用javaCV最新版本)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
- Code:log4
ylbtech-Code:log4 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 0. http://logging.apache.org/log4net/ 0 ...
- .NETFramework:Regex
ylbtech-.NETFramework:Regex 1.返回顶部 1. #region 程序集 System, Version=4.0.0.0, Culture=neutral, PublicKe ...