work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

WP7开发第一课:软件生命周期(其二)

Posted on 2011-11-12 21:17  work hard work smart  阅读(145)  评论(0编辑  收藏  举报
  • 接下来讲解下:闲置侦测
  • 什么是系统闲置侦测呢?WP7系统在一段时间没有操作后,为节省电源,屏幕会变暗,而再经一段时间后,便会锁定设备,将屏幕整个关闭。进入了生命周期中的 Deactivated 事件。但如果我们应用播放音乐呢?这样肯定是不行的,于是出现了“系统闲置侦测”,要设定 Idle detection 。
  • WP7 中,Idle detection 有两种,一种是应用级别的,一股是用户级别的:
    • ApplicationIdleDetectinMode
    • UserIdleDetectionMode

ApplicationIdleDetection 是应用程序闲置状态侦测,例如经过一段时间没有使用的话,设备会进入锁定,并且引发应用程序的 Deactivated 事件,随后应用程序进入 tombstoning 墓碑状态(墓碑是记录死亡信息的);ApplicationIdleDetectionMode 便是设定设备进入锁定时,应用程序会不会进入 tombstoning 墓碑状态,如果设定为关闭,那么将不会引发应用程序的 Deacticated 事件,也不会将应用程序进入 tombstoning 墓碑状态 ;好处有:

  • 应用程序仍然在执行中
  • 当用户返回应用程序时,由于没有进入 tombstoning 墓碑状态,能够快速回复

而要注意的:

  • 应用程序仍然在执行,所以会继续的消耗电池的电力;请特别注意,设备同样会进入锁定状态,只是应用程序不会停止
  • 所有有关 UI 的更新动作应该要停止,以节省电力的消耗
  • 所有动画、Timer 等动作应该要停止
  • Sensor 将会停止回报(例如 accelerometer 将会停止回报目前的数值)
  • 在改变闲置侦测模式时,永远要先询问使用者是否同意

tombstoning 墓碑机制主要用于在后台运行程序,毕竟WP7尚未支持多任务处理,可以用此机制模拟多任务。墓碑机制感觉跟耶稣死亡,三天后再度复活差不多。

获取目前 ApplicationIdleDetectionMode 的状态,以及判断目前设备是不是被锁定。

由上图可知由外向内为:PhoneApplicationFrame-->时间、信号状态栏、Application bar 、 Page-->Content

 Obscured、UnObscured 事件,这两个事件便是发生在 PhoneApplicationFrmae 中:

 

Obscured事件便是当进入锁定时会引发的事件,在这个事件中,可以去做将 Storyboard、UI 的更新动作停止的相关动作。

using Microsoft.Phone.Shell; Pprivate void SetAppIdleDetectionDisable() { //將應用程式閒置狀態偵測關閉 PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDeectitonMode.Disabled; PhoneApplicationFrame root = (App.Current.RootVisual) as PhoneApplicationFrame; if (root != null) { root.Obscured += new EventHandler<ObscuredEventArgs>(root_Obscured); root.Unobscured += new EventHandler(root_Unobscured); } else MessageBox.Show("Error"); }

把闲置状态侦测关闭之后,接着就是取得 PhoneApplicationFrame ,而 PhoneApplicationFrame 时也是透过 App 类别来取得,取得之后由于在相关的事件必须要有对应的处理动作,因此必须要挂载相关的事件;其中 Obscured 事件便是当进入锁定时会引发的事件,在这个事件中,可以去做将 Storyboard、UI 的更新动作停止的相关动作,例如下面这边以一个 Timer 为例子,在这个事件中会进行关闭的动作

void root_Obscured(object sender, ObscuredEventArgs e) { Debug.WriteLine("Unobscured"); if (e.IsLocked) { //當應用程式被Lock screen覆蓋時要處理的動作,停止動畫(storyboard)、UI更新等動作 timer.Stop(); } }

 

在设备进入锁定时,能够把一些不需要用到的部分关闭,以节省电源。

看完了关闭之后,那如果要重新把闲置状态侦测给开启呢?设定回 Enable 就可以了?这个动作没有错,但是目前的 Windows Phone 7 版本尚未支持,目前闲置模式关闭之后,要重启的唯一方式就是整个应用程序必须要重新开启才行,这部分要特别留意。而 MSDN 中有提到,建议还是可以在应用程序中加入相关的程序代码,但同时要做错误处理,例如说

private void SetAppIdleDetectionEnable() { if (PhoneApplicationService.Current.ApplicationIdleDetectionMode != IdleDetectionMode.Enabled) { try { PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Enabled; } catch (InvalidOperationException ex) { //platform not souported MessageBox.Show("Can't enable application idledection"); } } }

这样在未来的更新中,系统支持上来之后,你的应用程序功能就可以立刻的正常运作了。

 UserIdleDetectionMode 部分:

源地址:http://www.cnblogs.com/zhangdongzi/archive/2011/08/24/2152595.html

这个部分是侦测使用者闲置的状态,使用的方式跟刚刚 ApplicationIdleDetection 是极其类似的,主要的差异性如下:

  • 以目前来说,使用者闲置是指『当用户没有触碰屏幕操作,或是点选硬件按键时』,Sensor 的部分目前即使有改变(例如说转向等等),也是视为闲置中,这个部分在未来的更新中可能会有变更
  • 当设定为 Disable 时,装置永远不会进入锁定
  • UserIdleDetectionMode 是支持 Disable 以及 Enable 的

关闭:

private void SetUserIdleDetectionDisable() { PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; }

重启:

private void SetUserIdleDetectionEnable() { if (PhoneApplicationService.Current.UserIdleDetectionMode != IdleDetectionMode.Enabled) { try { PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Enabled; } catch (Exception ex) { //platform not souported MessageBox.Show("Can't enable user idledection"); } } }

这样便可以达到停止闲置状态的侦测,这对于一些单纯利用 Sensor 来进行操作的应用程序是相当有用的。