WP7开发第一课:软件生命周期(其二)
- 接下来讲解下:闲置侦测
- 什么是系统闲置侦测呢?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 部分:
这个部分是侦测使用者闲置的状态,使用的方式跟刚刚 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 来进行操作的应用程序是相当有用的。