`
dengzhangtao
  • 浏览: 678539 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android* 的唤醒锁

 
阅读更多

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 介绍了多种用于更改设备电源状态的唤醒锁标记:

标记值 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() 函数实现该操作。

01 public void screenLockUpdateState() {
02  
03     if (mIsDisplayLocked)
04      {
05         ...
06         // update display state
07       getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
08     } else
09 {
10         ...
11         // update display state
12           getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
13     }
14 }

编写唤醒锁(来自 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) {
02     ...
03     mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
04     ...
05     mWakeLock = mPowerManager.newWakeLock(mWakeLockState,
06                         "UMSE PowerTest");
07     if (mWakeLock != null) {
08         mWakeLock.acquire();
09     ...
10     }
11 }
12  
13 protected void onDestroy() {
14     if (mWakeLock != null) {
15         mWakeLock.release();
16         mWakeLock = null;
17     }
18     ...
19 }

结论

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

分享到:
评论

相关推荐

    Android中唤醒屏幕

    唤醒锁是Android系统提供的一种机制,用于阻止设备进入休眠状态。它分为两种类型: 1. ** partial_wake_lock**:只保证CPU运行,不亮屏,常用于后台服务。 2. ** screen brighter_wake_lock** 或 ** screen_on_wake_...

    Android唤醒锁检测及功耗优化机制.pdf

    知识点1:Android唤醒锁机制 Android 操作系统提供了唤醒锁机制,以避免系统进入休眠状态。唤醒锁机制可以使某些硬件在计算时保持运行状态,例如银行应用程序,当用户在线转账时,交易可能需要一段时间才能完成。...

    android 休眠和唤醒

    这个方法会立即关闭屏幕并使处理器进入低功耗模式,直到被外部事件(如闹钟、来电等)或系统内部的唤醒锁唤醒。调用`goToSleep`时,你需要传入一个参数,即休眠原因的标识码,这有助于系统追踪休眠的原因,例如`...

    android休眠与唤醒驱动流程分析

    android休眠与唤醒驱动流程分析 android wakelock 休眠 唤醒

    android和linux的唤醒机制

    - **获取和释放唤醒锁**:提供了接口来获取和释放唤醒锁。 下面展示了一些关键的代码片段: ```c enum { ACQUIRE_PARTIAL_WAKE_LOCK = 0, RELEASE_WAKE_LOCK, REQUEST_STATE, OUR_FD_COUNT }; const char *...

    Android 屏幕锁源码

    在Android系统中,屏幕锁是保护用户隐私和设备安全的重要机制。本文将深入解析Android屏幕锁源码,探讨其背后的实现原理与技术细节。 首先,Android屏幕锁主要由两部分组成:锁屏界面(Lock Screen)和解锁验证机制...

    Android自动解锁实例

    2. **唤醒锁(Wake Lock)**:Android系统提供了一种机制,即使设备屏幕关闭也能保持CPU运行。通过`PowerManager`类和`WakeLock`接口,开发者可以请求并管理这种锁,确保自动解锁过程不会因为设备进入休眠而中断。 ...

    android休眠与唤醒机制.zip

    2. Android唤醒机制: - 唤醒机制确保在特定条件下(如闹钟、网络数据传输等)设备能从休眠状态恢复。Android使用Wakelock API来实现这一功能,它允许应用程序请求保持CPU运行或防止设备进入休眠状态。 - Wakelock...

    Android唤醒、解锁屏幕代码实例

    在Android开发中,有时我们需要实现应用在特定场景下唤醒或解锁设备的功能,比如闹钟、消息提醒等。这里我们将详细探讨如何使用`KeyguardManager`、`KeyguardLock`、`PowerManager`以及`PowerManager.WakeLock`来...

    实用源码——Android屏幕锁源码.zip

    - **唤醒锁**:保持CPU处于活动状态,直到解锁过程完成,防止在输入密码或图案时设备自动休眠。 8. **测试用例** - **单元测试**:源码中可能包含针对各个组件和函数的测试用例,确保解锁功能的正确性。 通过...

    android休眠与唤醒

    ### Android休眠与唤醒 #### 一、概述 在现代移动设备中,电池续航能力是一项极其重要的性能指标。为了延长设备的使用时间,操作系统需要具备有效的电源管理功能。Android作为一款广泛使用的移动操作系统,其电源...

    Android 屏幕唤醒 + 屏幕解锁 + 开机服务监听(android.intent.action.BOOT-COMPLET)

    Android 屏幕唤醒 + 屏幕解锁 + 开机服务监听(android.intent.action.BOOT_COMPLET)添加权限:{//开机监听<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/><uses-permission android...

    android休眠与唤醒驱动流程分析.doc

    Android 休眠与唤醒驱动流程分析 Android 休眠与唤醒驱动流程分析是 Android 系统中的一部分,主要负责控制系统的休眠和唤醒过程。该过程是基于 Linux 内核的电源管理设计,但Android 对其进行了修改和优化,以适应...

    android 通过Power事件实现休眠和唤醒

    总结,通过监听Power事件并利用WakeLock和KeyguardLock,我们可以有效地控制Android设备的休眠和唤醒。然而,这种操作需要谨慎,因为它直接影响到用户的使用体验和电池寿命。在实际应用中,开发者应遵循最佳实践,...

    Android 屏幕锁源码.rar

    7. **电源管理和唤醒锁**:为了确保在设备屏幕关闭时仍能监听解锁事件,开发者需要使用PowerManager的`newWakeLock()`方法创建一个唤醒锁。合理管理唤醒锁可以避免电池过度消耗。 8. **Android安全框架**:理解...

    Android应用程序锁

    在Android操作系统中,应用程序锁是一种安全机制,它允许用户对特定的应用程序设置访问限制,以保护个人隐私或敏感数据不被未经授权的人访问。这个功能通常由第三方应用提供,如描述中提到的“基于Android的访问控制...

    Android 屏幕锁源码.zip

    在Android系统中,屏幕锁是保护用户隐私和设备安全的重要机制。这个压缩包"Android 屏幕锁源码.zip"包含的应该是实现Android屏幕锁定功能的相关代码,这为我们提供了深入理解Android安全机制和自定义屏幕锁屏界面的...

    Android自定义锁屏实现----仿正点闹钟滑屏解锁

    9. **权限管理**:在Android 6.0及以上版本,系统引入了运行时权限管理,你需要在应用运行时请求锁屏和唤醒设备的权限。 10. **测试与优化**:最后,对锁屏界面进行详尽的测试,确保在各种设备和Android版本上都能...

Global site tag (gtag.js) - Google Analytics