| 2008年03月18日 20:19 | |
由 ContentMaster 有限公司供稿
简介
应用开发人员已经习惯于为台式机和服务器设计软件,却很少考虑到节能和延长电池使用时间等问题。随着企业无线能力的普及和增强,这些问题理应受到所有平台应用开发人员的重视。本文将阐述开发人员为何应致力于开发高能效应用,并就开发过程中会用到的部分现有技术进行了概述。
本文主要面向为 Windows* 移动设备开发应用的软件设计人员。文中所述技术全部或部分适用于采用 Windows 98、98se、Millennium、XP、XP Tablet Edition*、CE* 和 CE.NET* 操作系统的笔记本电脑、平板电脑以及掌上电脑(PDA)。
定义
活动状态——应用执行有用工作时所处的状态。
休眠状态——移动设备在断电退出前,使其桌面内容和打开文件写入永久存储器时的状态。
空闲状态——应用未执行任何有用工作时所处的状态。
MFC——微软基础类库,它是一套内容丰富的 Win32 API,支持 Windows 平台上的应用开发。
p/Invoke——从 .NET 公共语言运行库(CLR)中调用本地代码的一种方法。
电源配置——Windows 操作系统中的一项预设配置,允许用户定制不同电源状态(如电池电量低或全功率等状态)下的系统行为。
恢复——当移动设备从待机或休眠模式恢复时引发的事件。
待机状态——为节能移动设备关闭硬件(如显示器、打印机、固定存储器等)时所处的状态。
挂起——当移动设备进入待机或休眠模式时引发的事件。
背景
移动设备数量的激增带来了一连串的机遇和挑战,为软件开发领域注入了新的活力。时断时续的网络连接、各不相同的设备外形尺寸以及迟缓滞后的网络速度,这些都是阻碍编写“移动敏感型”软件的众多障碍中的重要因素。其次,有限的电池使用时间也是一个问题。当然,如果开发人员愿意花时间定制应用,努力满足其在电源短缺条件下的运行需求,那么这个问题还是可以改善的。
Windows 平台提供了许多节能技巧,帮助延长移动设备的电池使用时间。作为一名应用开发人员,您若想充分利用这些技巧,首先应当了解关注能耗问题的重要性。一旦明白了这点,您便可以真正开始思考如何设计节能应用的问题。
本文主要面向为 Windows* 移动设备开发应用的软件设计人员。文中所述技术全部或部分适用于采用 Windows 98、98se、Millennium、XP、XP Tablet Edition*、CE* 和 CE.NET* 操作系统的笔记本电脑、平板电脑以及掌上电脑(PDA)。
定义
活动状态——应用执行有用工作时所处的状态。
休眠状态——移动设备在断电退出前,使其桌面内容和打开文件写入永久存储器时的状态。
空闲状态——应用未执行任何有用工作时所处的状态。
MFC——微软基础类库,它是一套内容丰富的 Win32 API,支持 Windows 平台上的应用开发。
p/Invoke——从 .NET 公共语言运行库(CLR)中调用本地代码的一种方法。
电源配置——Windows 操作系统中的一项预设配置,允许用户定制不同电源状态(如电池电量低或全功率等状态)下的系统行为。
恢复——当移动设备从待机或休眠模式恢复时引发的事件。
待机状态——为节能移动设备关闭硬件(如显示器、打印机、固定存储器等)时所处的状态。
挂起——当移动设备进入待机或休眠模式时引发的事件。
背景
移动设备数量的激增带来了一连串的机遇和挑战,为软件开发领域注入了新的活力。时断时续的网络连接、各不相同的设备外形尺寸以及迟缓滞后的网络速度,这些都是阻碍编写“移动敏感型”软件的众多障碍中的重要因素。其次,有限的电池使用时间也是一个问题。当然,如果开发人员愿意花时间定制应用,努力满足其在电源短缺条件下的运行需求,那么这个问题还是可以改善的。
Windows 平台提供了许多节能技巧,帮助延长移动设备的电池使用时间。作为一名应用开发人员,您若想充分利用这些技巧,首先应当了解关注能耗问题的重要性。一旦明白了这点,您便可以真正开始思考如何设计节能应用的问题。
为何每位移动开发人员都应考虑能耗问题
目前,多数台式机和服务器软件开发人员都习惯于在交流电源充足的条件下开发和运行软件。但在不久的将来,他们中的许多人将不得不开始编写基于(移动)设备的应用。
一方面,这是近期技术发展趋势的必然结果。移动设备的数量每年都在以指数级的速度增长。同时,这些设备的价格也在大幅度下调。平板电脑和笔记本电脑也越来越广泛地被部署于企业上下。此外,随着微软 .NET Compact Framework* 的发布,全球 700 万 Visual Studio .NET* 开发人员将得以运用早前用于台式机领域的工具和技能,为运行 Windows CE .NET 操作系统的掌上电脑及其它手持设备开发移动应用。
另一方面,开发高质量(而不仅仅是数量庞大)的移动软件是一项回报丰厚的工作。只有移动软件才可能确保用户拥有随时随地访问重要数据和操作的能力。但是,如果相应的支持设备经常因电能耗尽而停机,那么这种能力也只是个空想。
由于现代操作系统均能提供一些节能机制,这就使得部分开发人员误以为在开发过程中完全可以忽略电池使用时间这一因素。然而,操作系统本身提供的这些节能机制往往过于简单,远不能作为节约能耗的完整解决方案。不过这些操作系统中采用的部分 API 与事件(如 Windows 平台中的电源管理 API)也可以作为有益借鉴,应用开发人员可以将其视为开发“电源智能型应用”的捷径。
这类应用具有一大功能,就是监听来自操作系统的通知,及时获知将要发生的“挂起(Suspension)”或刚刚发生的“恢复(Resume)”事件。挂起这类事件一旦发生,如果处理不当就可能导致应用数据丢失。因此,设计完善的移动应用应当考虑到这个问题,在挂起发生前保存数据并关闭已打开的资源。同样,在恢复完成时也要考虑在存储器中检索该数据,并重新打开这些资源。
同理,应用可以在获得其即将转入低功耗状态运行的通知时采取各种节能措施。此类特性对应用开发人员来说颇有价值,原因很简单:应用的使用时间延长了,人们就能完成更多的工作。
如何在 Win32 应用中延长电池使用时间
Windows 平台提供了两大应用开发技术:Win32 和 .NET。Win32 技术是一个 API 套件,可在本地层通过直接调用与函数回调实现与操作系统的直接交互。而 .NET 是一种虚拟执行环境,它位于 Win32 API 顶部,可提供一种“可管理”代码执行环境。
Win32 层中的所有 API 都是能够降低能耗的重要因素,它们都位于 kernel32.lib 或 powrprof.lib 库中。主要 API 函数如下:
- GetSystemPowerStatus——返回完整描述移动设备当前电源状态(交流或直流、级别等)的数据结构。
- GetActivePwrScheme——返回设备当前所用的电源配置。
- EnumPwrSchemes——返回当前设备定义的电源配置详情列表。
- SetExecutionState——利用该函数,应用可防止操作系统在规定操作结束前转入“挂起”模式。例如,将“挂起”延迟一段时间,直到将给定的动画播放完毕。
这些 API 由事件通知机制支持,这些机制会通知应用对设备的当前电源状态进行大量调整。这些讯息(如 WM_POWERBROADCAST)一般会通过 Windows forms 和 controls 上的 WndProc 方法进行通知。
如何在 .NET 环境下实现节能
从某种程度上说,.NET 仅仅提供了一种将这些事件与 API 打包使用的方式,将一切与此相关的访问限制在更加安全、可靠的环境下。例如,GetSystemPowerStatus、GetActivePwrScheme 和 SetExecutionState API 函数都能够通过 p/Invoke 机制从 .NET 处成功调用。台式机环境与此类似,如果开发人员能够提供出某种逻辑机制,对系统电源状态变化进行有效的回应,那么用户就无需再使用 Windows forms 上的 WndProc 方法了。
Windows CE.NET 同时还自带一套应变措施,其中一项就是取消了 WM_POWERBROADCAST 讯息。实际上,查询系统电源状态的能力仅可在安装了可选电源管理组件(由设备制造商完成)的设备上使用。因此,不必再对电源管理信息进行监听,您只需定期轮询系统查找设备电池的当前状态即可。
但基本上轮询方法并不适用于移动设备。因为轮询会耗费比平均水平更长的 CPU 周期,这反而会缩短设备的电池使用时间。只要符合应用逻辑,就应该尽量使用异步回调。
最后需要指出,只要使用 .NET Compact Framework(专门面向 Windows CE 和 CE.NET 设备的 .NET 版本),就必须将最小化至后台运行的应用中的任何资源密集型任务挂起。.NET Timers(定时器)可能是这方面的最佳范例。无论何时,只要 .NET 应用处于非活动状态,定时器都应该关闭。
总结与参考
本文主要解释了应用开发人员努力降低移动设备能耗的重要性。Windows 平台中为此提供了许多有用的工具和技术。无论选择何种方法,切记一点:在电源不足时,即使是最卓越的应用也不过是一堆无用的代码。
参考资料
面向移动性的应用电源管理 [PDF]
CE .NET* 中的移动电源管理*
微软开发人员网络*
参考资料

面向移动性的应用电源管理 [PDF]
CE .NET* 中的移动电源管理*
微软开发人员网络*

