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 报告中文版放送

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

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

用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…

tomcat结合nginx使用小结

tomcat结合nginx部署 相信很多人都听过nginx,这个小巧的东西慢慢地在吞食apache和IIS的份额。那究竟它有什么作用呢?可能很多人未必了解。 说到反向代理,可能很多人都听说,但具体什么是反向代理,很多人估计就不清楚了。…

如何学好GIS,彻底领悟这几句话就够了!!!

目 录前言1. GIS起源于地图学2. GISer心中要有地图3. 空间数据是GIS的血液4. 空间分析是GIS的灵魂5. GIS是智慧城市的操作系统前言 地理信息系统 (GIS)是以可视化和分析地理配准信息为目的,用于描述和表征地球及其他地理现象的一种系统。 地…

【iVX 初级工程师培训教程 10篇文拿证】07 08 新闻页制作

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

【WEB API项目实战干货系列】- WEB API入门(一)

这篇做为这个系列的第一篇,做基本的介绍,有经验的人可以直接跳到第二部分创建 ProductController。创建 Web API 项目 在这里我们使用VS2013, .NET 4.5.1创建一个Web API 2的项目选择项目WEB API模板, 在最下方的MVC主要是默认会自带微软的API Helper, 使…

Android之打开继承DialogFragment对话框里面EditText获取光标并且弹出键盘把底部布局顶上去

1 需求 打开继承DialogFragment对话框里面EditText获取光标并且弹出键盘把底部布局顶上去 2 效果爆照如下 打开这个DialogFragment 3 关键代码实现 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)…

【iVX 初级工程师培训教程 10篇文拿证】06 数据库及服务

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