android 电源管理 wakelock 唤醒锁机制

Android 电源管理 — 唤醒锁全新上市

大多数人可能都遭遇过手机的电池续航时间较短带来的尴尬。 这极其令人讨厌。 没电的手机和一块水泥砖没什么差别。 一般而言,如果用户的手机电池无法持续一整天,他们会感到非常不满。而且,当手机充电时用户无法使用手机,这同样会带来极大的不便。

传统上需要使用笔记本电脑或 PC 处理的任务,现在借助全新的改进软件,即使未在桌旁也可使用智能手机进行处理。 但是相比笔记本电脑,智能手机的小外形很大地限制了可容纳的电池尺寸。 既要求手机具备笔记本电脑的功能,同时又要求其具备全天候的电池续航能力是难以实现的。

通过采用出色的电源管 理,Android 和其他移动操作系统实现了耐久的电池续航时间。 停止使用手机后不久,显示器便会关闭,CPU 会进入深度节能状态,因此在不使用它时仅会消耗极少的电源。 这就是电话在使用时充一次电便能持续使用多日的原因。 借助 Android 的电源管理器,正常计划是显示器关闭时 CPU 也关闭。

但是,Android 开发人员能够(并有权限)阻止 Android 设备进入睡眠模式。 他们可能希望让 CPU 处于活动状态 — 即使显示器关闭。 或者可能他们希望在执行某项活动时阻止显示器自动关闭。 出于此原因,Google* 在其 PowerManager API 中增加了唤醒锁。 阻止设备进入睡眠模式的应用可以使用唤醒锁。 只要系统上有活动的唤醒锁,设备便无法进入挂起模式,除非释放唤醒锁。 使用唤醒锁时,一定要了解到当您不需要唤醒锁时,必须将其正确释放,因为未释放的唤醒锁无法进入默认状态以节能,从而很快便会将设备的电池耗尽。

本文将会为您介绍一些在 Android 4.0 中默认使用唤醒锁的 Android 应用(和使用模式),以便帮助您了解何时使用此项技术。 然后,将会介绍一个 SDPSamples 集中的示例应用“Wakelocks”,以展示如何编写唤醒锁的代码。

唤醒锁应用使用情况

借助 Android, 有一种方法可以查看哪些服务启用了唤醒锁,阻止系统进入低功耗状态。 设备上的 /proc/wakelocks 文件列出了定义使用唤醒锁的服务和驱动程序。 通过监控 /sys/power/wake_lock 文件的内容(需要根访问),您可以了解 CPU 资源何时启用了唤醒锁,以及哪种服务启用了 wakelock2。 我捕获了几种使用案例,其中运行 Android 4.0 的 Galaxy Nexus 上启用了唤醒锁,如下所示:

使用的应用执行的操作使用了唤醒锁的服务运行状况
任意按下 UI Widget(如点击按钮或 ListView 项)PowerManagerService启用并在 5 秒钟后释放锁定
地图/导航启用地图或进入导航gps-lock启用锁定并使用 GPS
YouTube观看流视频PowerManagerService在视频播放的整个过程中一直启用唤醒锁
Music听音乐PowerManagerService在音乐播放的过程中一直启用唤醒锁

表格:一些默认的 Android 应用演示唤醒锁的使用

YouTube 和 Music 应用能够很好地展示不同级别的唤醒锁。 用户播放视频时,YouTube 应用将会启用唤醒锁。 在播放视频的整个过程中,显示器会保持开启状态(忽略系统的显示设置)。 但是,如果用户在播放过程中按下了电源按钮,设备将会挂起,这会导致显示器关闭以及音频/视频停止播放。 Music 应用在播放音频时使用不同的唤醒锁。 显示设置无法更改,因此设备的屏幕将会根据用户的显示设置来关闭。 显示器关闭后,唤醒锁会让 CPU 保持活动状态以便音频能够继续播放 — 即使用户按下了电源按钮。

选择唤醒锁(在执行前)

在了解如何编写唤醒锁之前,一定要了解唤醒锁的种类,以便为您的应用挑选最适合的唤醒锁。 Android PowerManager API 介绍了多种用于更改设备电源状态的唤醒锁标记:

标记值CPU屏幕键盘
PARTIAL_WAKE_LOCK开启关闭关闭
SCREEN_DIM_WAKE_LOCK开启调暗(Dim)关闭
SCREEN_BRIGHT_WAKE_LOCK开启调亮(Bright)关闭
FULL_WAKE_LOCK开启调亮(Bright)调亮(Bright)

表格: 源自 Android PowerManager API。

该 API 突出强调了唤醒锁会显著缩短 Android 设备的电池续航时间,因此如果可以避免应尽量减少使用它们。 如果使用,也应尽快将其释放。

使用唤醒锁的应用必须申请特别 许可才可执行。 这可通过应用清单文件中的 android.permission.WAKE_LOCK 许可来实现。 也就是说,当用户通过 Google Play 安装使用唤醒锁的应用时,系统会提醒他们该应用包含的特性可能会“Prevent phone from sleeping(阻止手机进入睡眠状态)”。 如果开发人员希望阻止某个应用的显示器在特定使用情况下变暗,可采用 Google 另外提供的一种方法,这种方法无需特别许可。 WindowManager 包括一个 FLAG_KEEP_SCREEN_ON 变量,当应用的视图要阻止界面关闭时可对其进行设置。 建议在显示控制上使用这种方法,因为其影响在应用内相互独立。 用户任务切换到其他应用上之后,WindowManager 将会立刻释放唤醒锁。

让显示器保持开启状态(源自 SDPSamples)

SDPSamples 集的唤醒锁应用演示了(包括代码)应用如何使用 Window Manager 而非通过编写唤醒锁代码让显示器保持开启状态。 启用唤醒锁应用后,选择“Win Man Screen On”列表项。

只要按钮的状态显示“Screen is LOCKED”,界面就会保持开启状态。 按钮的状态更改为“Screen is UNLOCKED”后,如果超过 5 秒钟不操作,显示器将会关闭。

在代码中,每次按下按钮且状态发生改变时,通过设置和释放当前窗口的 FLAG_KEEP_SCREEN_ON 变量可在 WakeLockActivity.java 中使用 screenLockUpdateState() 函数实现该操作。

public void screenLockUpdateState() {if (mIsDisplayLocked){...// update display stategetWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);} else 
{...// update display stategetWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);}
} 

编写唤醒锁(来自 SDPSamples)

SDPSamples 集中的唤醒锁应用还包括执行不同唤醒锁的代码。 启动唤醒锁应用后,从下列四种唤醒锁中选择: Power Wake Lock Full、Power Wake Lock Bright、Power Wake Lock Dim 和 Power Wake Lock Partial。 这 4 个列表项对应着 PowerManager API 中介绍的 4 种唤醒锁标记。 每一项将会分别演示 5 秒内尝试关闭屏幕时设备如何响应。

通过监控 /sys/power/wake_lock 文件的内容(需要根访问),您可以看到按下电源按钮后 PARTIAL_WAKE_LOCK 是唯一仍然有效的唤醒锁。 其他的唤醒锁通过多种级别的亮度阻止显示器关闭。

编写唤醒锁的第一步是申请许可,之后才可使用清单 AndroidManifest.xml 内的唤醒锁:

这一步完成后,便可以创建唤醒锁对象,包括控制唤醒锁的获取()函数和释放()函数。 WakeLockActivity.java 文件内的编码很好地展示了该情况:

public void onCreate(Bundle savedInstanceState) {...mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);...mWakeLock = mPowerManager.newWakeLock(mWakeLockState,"UMSE PowerTest");if (mWakeLock != null) {mWakeLock.acquire();...	}
}protected void onDestroy() {if (mWakeLock != null) {mWakeLock.release();mWakeLock = null;}...	
}

结论

唤醒锁是 Android 中一款强大的概念,可支持开发人员修改设备的默认电源状态。 在应用中使用唤醒锁的风险:它会减少设备的电池续航时间。 使用唤醒锁的明显优点可在 Google 提供的多种默认应用中看得到,如道路导航和音乐/视频播放。 因此,开发人员应自行确定他们的应用模型能否从使用唤醒锁中得益。

转载于:https://www.cnblogs.com/jasonxcj/p/4994343.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初始Bootstrap

使用示例①下载Bootstrap框架 网址:http://v3.bootcss.com/getting-started/#download②解压得到三个文件③将文件添加进项目后,在页面中引用必要的css和js④查看效果(a标签美化得不要不要的了~)更多学习Bootstrap的资…

APP无埋点流程

最近无埋点技术很是流行,抽空研究了下诸葛IO,talkingData以及百分点这些业内知名公司的无埋点SDK,抽取其中重要的信息供大家参考:1、首先什么是无埋点呢,其实所谓无埋点就是开发者无需再对追踪点进行埋码,而…

Esri Maps For Office制作漂亮的地图

ArcGISOnline是一个基于云架构的资源中心,在这里你可以发布自己的地图资源、浏览其它ArcGIS爱好者发布的应用程序;总之,它为我们提供了一个在线交流的场所。 EsriMapsForOffice是ArcGISonline推出的一个Office环境的插件,可以让我们在Excel、Powerpoint中进行制图,就像在…

《什么是 eBPF》O'Reilly 报告中文版放送

祝大家端午安康,国泰民安,世界和平。今年端午节,鄙人人在北京,所在区有中风险地区,而老家又是所在省的唯一一个中风险地区,既出不了京,也回不了家。可谓有家不能回,真是每逢佳节倍思…

介绍一个代码管理系统-Git

Git是一个跨平台的代码管理系统,据说比SVN好很多,呵呵!! http://git.or.cz/ 一个基于Git管理的代码共享网站 http://github.com/ 在windows下的客户端程序(msysgit):http://code.google.com/p/msysgit/ 还没有图形客户…

优秀博客链接(linux c/c++ java go php android ios 前端 j2ee windows linux 算法 ACM 深度/机器学习 AI opencv nlp)

pudn阿甘兄 前端 服务端 底层 移动端 大数据 云计算 AI 培训机构的课程差不多就这一套了 大数据 AI NLP 高等数学 LeetCode、《数据结构与算法之美》学习笔记、AI前端资料学习,vue.js react.js flutterleetCode刷完的神机器学习数据挖掘基础Linux c/c大神 目前cs…

一键将Python2代码自动转化为Python3

Python2的代码直接在Python3环境运行的话会报错误: 如果大量的代码,无论是批量替换,还是逐行修改都够累的,这活儿表示不能干!!! 有没有办法一键转换呢? 百度了一下发现网上的方法如…

【前端就业课 第一阶段】HTML5 零基础到实战(十)JavaScript基础一篇入门

注意:手机(APP)打开,内容显示更佳,不会的私聊博主即可 想要拿代码或加入学习计划(** 博主会监督你并且教你写文章 **)的拉到最下面(PC端Web打开)加博主即可,目…

推理集 —— 实证

现实世界的诸多事就像物理定律,而不是数学定理,也即不保证绝对正确,而需要不断地验证,实证。 不能不经实证就轻言一件事是行还是不行,尤其在事情如果实证的成本较低,比如今天图书馆是不是开门,路…

一款开源的跨平台实时web应用框架——DotNetify

今天给大家介绍一个开源的轻量级跨平台实时HTMLC#.NET Web应用程序开发框架——DotNetify,允许你在C#.NET后端上创建具有React、React Native、Vue或Blazor 前端的实时、响应式、跨平台应用程序。它的主要特点是:简单且轻量响应式后端MVVM内置实时解决方…

【GeoDataBase】Geodatabase智能化操作:属性域

Geodatabase中所包含的不仅仅是要素类、要素集和表,还可能包含关系类、注释类、几何网络、拓扑等不同的结构和类别。 地理数据库按照面向对象的模型存储地理信息,也可以将其非空间信息保存在表中。对于要素和表可以设置一些规则进行限制,对属性的约束称为属性域。 属性域是描…

Android之All children of ConstraintLayout must have ids to use ConstraintSet

1 问题 Fatal Exception: java.lang.RuntimeException: All children of ConstraintLayout must have ids to use ConstraintSetat androidx.constraintlayout.widget.ConstraintSet.readFallback(ConstraintSet.java:459)at androidx.constraintlayout.motion.widget.MotionS…

Lua性能优化

规则1:不要优化。 规则2:仍然不要优化(专家除外) 当用Lua编程时,这两条规则显得尤为重要。Lua以性能著称,而且在脚本语言中也因此而值得赞美。 然而,我们都知道性能是编程的一个关键因素。具有复…

常用的LINQ to SQL 用法

一、Where操作 适用场景:实现过滤,查询等功能。 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句。 Where操作包括3种形式,分别为简单形式、关系条件形…

用Python写一个将Python2代码转换成Python3代码的批处理工具

之前写过一篇如何在windows操作系统上给.py文件添加一个快速处理的右键功能的文章:《一键将Python2代码自动转化为Python3》,作用就是为了将Python2的文件升级转换成Python3的文件。之后,有朋友问,如果有很多文件需要转换&#xf…

WP 手机Lumia 820 锁屏密码的POJI研究

Windows Phone lumia 手机锁屏密码的POJI研究大家好今天给大家分享一个最新研究案例,近日笔者Nokia Lumia 820,由于客户密码失误太多,导致锁屏23000余分钟,,请看:型号Nokia Lumia820条件:Lumia8…

ArcGIS10从入门到精通系列实验图文教程(附配套实验数据持续更新)

文章目录1. 专栏简介2. 专栏地址3. 专栏目录1. 专栏简介 本教程《ArcGIS从入门到精通系列实验教程》内容包括:ArcGIS平台简介、ArcGIS应用基础、空间数据的采集与组织、空间数据的转换与处理、空间数据的可视化表达、GIS空间分析导论、矢量数据的空间分析、栅格数据…

【iVX 初级工程师培训教程 10篇文拿证】09 聊天室制作

目录 【iVX 初级工程师培训教程 10篇文拿证】01 了解 iVX 完成新年贺卡 【iVX 初级工程师培训教程 10篇文拿证】02 数值绑定及自适应网站制作 【iVX 初级工程师培训教程 10篇文拿证】03 事件及猜数字小游戏 【iVX 初级工程师培训教程 10篇文拿证】04 画布及我和 iVX 合照 【iV…

为什么Dapr是比SpringCloud和Istio更优雅的微服务框架?

作者:徐磊文章首发地址:https://smartide.cn/zh/blog/2022-0601-dapr/Dapr 是微软主导的云原生开源项目,2019年10月首次发布,到正式发布 V1.0 版本的不到一年的时间内,github star 数达到了 1.2万(现在已经…

Android之模拟网络请求返回http 502、400、401、402错误码

1 问题 app 网络框架协程没有做网络异常捕获处理,想本地测试网络接口,希望网络接口返回Http的错误码 比如502、400、401、402 2 解决办法 1、pc安装Fiddler Everywhere 2、让Fiddler Everywhere支持抓http和https的包 3、保持手机和电脑同一个局域网&am…