ApplicationIdleDetection 是应用程序闲置状态侦测,例如经过一段时间没有使用的话,设备会进入锁定,并且引发应用程序的 Deactivated 事件,随后应用程序进入 tombstoning 墓碑状态(墓碑是记录死亡信息的);ApplicationIdleDetectionMode 便是设定设备进入锁定时,应用程序会不会进入 tombstoning 墓碑状态,如果设定为关闭,那么将不会引发应用程序的 Deacticated 事件,也不会将应用程序进入 tombstoning 墓碑状态 ;好处有:
而要注意的:
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 是极其类似的,主要的差异性如下:
关闭:
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 来进行操作的应用程序是相当有用的。