2012/2/9
当 Windows Phone 操作系统检测到用户或当前应用程序处于空闲状态时,可以采取措施以减少设备的耗电量。根据您正在创建的应用程序类型,可能需要为用户或应用程序禁用空闲检测。本主题说明如何修改操作系统的空闲行为。
重要说明: |
---|
这项 Windows Phone 功能需要应用程序满足认证要求才能在 Windows Phone 商城上市。您应该在设计和测试应用程序时考虑这些要求。有关更多信息,请查看 Windows Phone 7 应用程序认证要求。 |
在当前的版本中,如果用户使手机处于锁定状态,则认为此时应用程序处于空闲状态。在未来的版本中,限定应用程序空闲的条件可能会变更。在启用应用程序空闲检测时,操作系统将取消激活空闲的应用程序。禁用应用程序空闲检测要求操作系统不执行本服务。通过将应用程序 PhoneApplicationService 对象的 ApplicationIdleDetectionMode 属性设置为 Disabled 来禁用应用程序空闲检测。即使应用程序空闲检测被禁用,操作系统也可能会因其他原因(如电池耗尽)取消激活应用程序。
Windows Phone OS 7.1 空闲检测的更改
Windows Phone OS 7.1 有许多功能可以启用和改善大多数应用程序方案,而这些应用程序方案此前是通过禁用空闲检测处理的。有关这些功能的更多信息,请查看 Windows Phone 多任务处理功能中的“快速应用程序切换”、“后台音频代理”和“计划任务”章节。
请不要为了缩短应用程序在手机解锁后的恢复时间或者为了在手机锁定后保持应用程序状态而禁用空闲检测。当锁定屏幕启动时,在 Windows Phone OS 7.1 上运行的应用程序进入休眠状态;当手机解锁时,该应用程序则会迅速恢复到与他们进入休眠状态时完全相同的状态。这一切均自动完成,无需消耗电池的电量,也不会因禁用空闲检测带给用户潜在的隐藏数据计划成本。
禁用 Windows Phone OS 7.1 应用程序空闲检测的适当理由包括:手机锁定时核心功能(例如,运动跟踪应用程序)仍需继续运行,或在锁定状态下以后台代理不支持的方式播放音频。
重要说明: |
---|
适用于在 Windows Phone OS 7.1 上运行的应用程序。请不要为了加快应用程序恢复而禁用应用程序空闲检测。这样做不会提高性能或改善应用程序的维护状态,反而会导致应用程序更快速地消耗设备电量,从而造成负面的用户体验。 Microsoft 强烈建议:除非以上提到的功能不支持应用程序的要求,否则所有在 Windows Phone OS 7.1 上运行的 Windows Phone OS 7.0 应用程序都应停止禁用空闲检测。 |
禁用应用程序空闲检测的 Silverlight 应用程序列表
如果 Silverlight for Windows Phone 应用程序禁止在锁定屏幕状态下运行应用程序空闲检测,则应该执行以下任务减少锁定屏幕启动时应用程序的耗电量。
-
实现应用程序根 PhoneApplicationFrame 对象的 Obscured 事件处理程序。在锁定屏幕启动时或某些其他操作(如收到来电)遮盖了正在运行的应用程序架构时,会引发此事件。在 Obscured 事件处理程序中执行以下步骤。
-
使用 System.Threading.Timer.Dispose 和 DispatcherTimer.Stop 停止所有活动的计时器。
-
通过调用 Storyboard.Pause 或 Storyboard.Stop 停止所有动画。
-
通过调用 Stop()()()() 停止加速度计。
-
通过调用 Stop()()()() 停止位置服务。
-
向您的应用程序发出信号:不应执行新网络请求和独立存储操作。
-
实现 Unobscured 事件处理程序。锁定屏幕解锁时,会引发这个事件。在此事件处理程序中,应该重新启动所有已通过 Obscured 事件处理程序停止的程序。
禁用应用程序空闲检测的 XNA Framework 游戏列表
如果 XNA for Windows Phone 游戏禁止在锁定屏幕状态下运行应用程序空闲检测,则应该执行以下任务减少锁定屏幕启动时应用程序的耗电量。
-
向应用程序发出信号,要求其不执行任何操作便立即从 Microsoft.Xna.Framework.Game.Update 方法中返回。
-
将 Microsoft.Xna.Framework.Game.InactiveSleepTime 属性设置为 1 秒钟。
禁用应用程序空闲检测时的其他注意事项
以下列表显示了一些禁用空闲检测的应用程序的重要信息。
-
应该谨慎使用该功能,因为手机锁定时运行的应用程序会继续消耗设备的电池。
-
如果应用程序使用 MediaElement 对象,则应该通过 Obscured 事件处理程序将其 Source 属性设置为空,然后还原 Unobscured 事件中的前一个值,以确保 MediaElement 不会在启用锁定屏幕时消耗资源。
-
锁定屏幕启动时,加速度计不会返回数据。
-
初始化 PhoneApplicationFrame 对象之前无法设置 ApplicationIdleDetectionMode。
-
请在禁用 UserIdleDetectionMode 或 ApplicationIdleDetectionMode 之前,总是询问用户是否希望这样做。应用程序不应假设用户希望作出此行为。
-
在当前的版本中,禁用应用程序空闲检测以后,无法在单个应用程序实例中启用。这样做将引发异常。在未来的版本中会支持此功能,所以当应用程序不再需要进行应用程序空闲检测时可以选择将其禁用,并捕捉预期的异常。以下代码片断显示了这种实现。
// Custom function to turn off idle detection. This will throw an exception in the current release. public void TryReenableApplicationIdleDetection() { bool didEnable = false; try { Microsoft.Phone.Shell.PhoneApplicationService.Current.ApplicationIdleDetectionMode = Microsoft.Phone.Shell.IdleDetectionMode.Enabled; didEnable = true; } catch (InvalidOperationException ex) { // This exception is expected in the current release. } // Possibly use the value of didEnable to decide what to do next. // If it is 'true', then your app will be deactivated. // If it is 'false', then your app will keep running. }
通过将应用程序 PhoneApplicationService 对象的 UserIdleDetectionMode 属性设置为 Disabled 来禁用用户空闲检测。如果启用用户空闲检测,则操作系统会在用户处于空闲状态时进入低功耗状态。若要禁用此属性,则操作系统不能执行此服务。即使用户与屏幕或硬件按钮没有进行物理交互时应用程序仍需要继续运行,可以使用此属性来禁用用户空闲检测。示例方案包括逐圈导航应用程序和使用加速度计进行输入的游戏。
此功能应谨慎使用。即使用户没有使用手机时,禁用用户空闲检测的应用程序也将继续运行并消耗电池的电量。建议禁用用户空闲检测的应用程序实现它们自己的空闲检测形式,并在适当的时候启用UserIdleDetectionMode。例如,如果一段时间内加速度计显示没有活动,则基于加速度计的游戏应启用用户空闲检测。
在当前版本中,当用户在设备锁定超时期限(在设备的“设置”页面中指定)内未接触屏幕或硬件按键时,操作系统将其视为空闲。在未来的版本中,检测用户空闲状态的条件可能会有更改。