WakeLock_WhitePaper.doc
BSD2.0.txt
WakeLock.zip
Christopher Bird
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 介绍了多种用于更改设备电源状态的唤醒锁标记:
表格: 源自 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() 函数实现该操作。
01 |
public void screenLockUpdateState() {
|
07 |
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
12 |
getWindow().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 文件内的编码很好地展示了该情况:
01 |
public void onCreate(Bundle savedInstanceState) {
|
03 |
mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
|
05 |
mWakeLock = mPowerManager.newWakeLock(mWakeLockState,
|
07 |
if (mWakeLock != null) {
|
13 |
protected void onDestroy() {
|
14 |
if (mWakeLock != null) {
|
结论
唤醒锁是 Android 中一款强大的概念,可支持开发人员修改设备的默认电源状态。 在应用中使用唤醒锁的风险:它会减少设备的电池续航时间。 使用唤醒锁的明显优点可在 Google 提供的多种默认应用中看得到,如道路导航和音乐/视频播放。 因此,开发人员应自行确定他们的应用模型能否从使用唤醒锁中得益。
相关推荐
唤醒锁是Android系统提供的一种机制,用于阻止设备进入休眠状态。它分为两种类型: 1. ** partial_wake_lock**:只保证CPU运行,不亮屏,常用于后台服务。 2. ** screen brighter_wake_lock** 或 ** screen_on_wake_...
知识点1:Android唤醒锁机制 Android 操作系统提供了唤醒锁机制,以避免系统进入休眠状态。唤醒锁机制可以使某些硬件在计算时保持运行状态,例如银行应用程序,当用户在线转账时,交易可能需要一段时间才能完成。...
这个方法会立即关闭屏幕并使处理器进入低功耗模式,直到被外部事件(如闹钟、来电等)或系统内部的唤醒锁唤醒。调用`goToSleep`时,你需要传入一个参数,即休眠原因的标识码,这有助于系统追踪休眠的原因,例如`...
android休眠与唤醒驱动流程分析 android wakelock 休眠 唤醒
- **获取和释放唤醒锁**:提供了接口来获取和释放唤醒锁。 下面展示了一些关键的代码片段: ```c enum { ACQUIRE_PARTIAL_WAKE_LOCK = 0, RELEASE_WAKE_LOCK, REQUEST_STATE, OUR_FD_COUNT }; const char *...
在Android系统中,屏幕锁是保护用户隐私和设备安全的重要机制。本文将深入解析Android屏幕锁源码,探讨其背后的实现原理与技术细节。 首先,Android屏幕锁主要由两部分组成:锁屏界面(Lock Screen)和解锁验证机制...
2. **唤醒锁(Wake Lock)**:Android系统提供了一种机制,即使设备屏幕关闭也能保持CPU运行。通过`PowerManager`类和`WakeLock`接口,开发者可以请求并管理这种锁,确保自动解锁过程不会因为设备进入休眠而中断。 ...
2. Android唤醒机制: - 唤醒机制确保在特定条件下(如闹钟、网络数据传输等)设备能从休眠状态恢复。Android使用Wakelock API来实现这一功能,它允许应用程序请求保持CPU运行或防止设备进入休眠状态。 - Wakelock...
在Android开发中,有时我们需要实现应用在特定场景下唤醒或解锁设备的功能,比如闹钟、消息提醒等。这里我们将详细探讨如何使用`KeyguardManager`、`KeyguardLock`、`PowerManager`以及`PowerManager.WakeLock`来...
- **唤醒锁**:保持CPU处于活动状态,直到解锁过程完成,防止在输入密码或图案时设备自动休眠。 8. **测试用例** - **单元测试**:源码中可能包含针对各个组件和函数的测试用例,确保解锁功能的正确性。 通过...
### Android休眠与唤醒 #### 一、概述 在现代移动设备中,电池续航能力是一项极其重要的性能指标。为了延长设备的使用时间,操作系统需要具备有效的电源管理功能。Android作为一款广泛使用的移动操作系统,其电源...
Android 屏幕唤醒 + 屏幕解锁 + 开机服务监听(android.intent.action.BOOT_COMPLET)添加权限:{//开机监听<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/><uses-permission android...
Android 休眠与唤醒驱动流程分析 Android 休眠与唤醒驱动流程分析是 Android 系统中的一部分,主要负责控制系统的休眠和唤醒过程。该过程是基于 Linux 内核的电源管理设计,但Android 对其进行了修改和优化,以适应...
总结,通过监听Power事件并利用WakeLock和KeyguardLock,我们可以有效地控制Android设备的休眠和唤醒。然而,这种操作需要谨慎,因为它直接影响到用户的使用体验和电池寿命。在实际应用中,开发者应遵循最佳实践,...
7. **电源管理和唤醒锁**:为了确保在设备屏幕关闭时仍能监听解锁事件,开发者需要使用PowerManager的`newWakeLock()`方法创建一个唤醒锁。合理管理唤醒锁可以避免电池过度消耗。 8. **Android安全框架**:理解...
在Android操作系统中,应用程序锁是一种安全机制,它允许用户对特定的应用程序设置访问限制,以保护个人隐私或敏感数据不被未经授权的人访问。这个功能通常由第三方应用提供,如描述中提到的“基于Android的访问控制...
在Android系统中,屏幕锁是保护用户隐私和设备安全的重要机制。这个压缩包"Android 屏幕锁源码.zip"包含的应该是实现Android屏幕锁定功能的相关代码,这为我们提供了深入理解Android安全机制和自定义屏幕锁屏界面的...
9. **权限管理**:在Android 6.0及以上版本,系统引入了运行时权限管理,你需要在应用运行时请求锁屏和唤醒设备的权限。 10. **测试与优化**:最后,对锁屏界面进行详尽的测试,确保在各种设备和Android版本上都能...