WP7 - Runing App under the Locked Screen详述

Windows Phone 7 – Runing App under the Locked Screen详述


在老狗分享了 这一篇关于如何让开发出来的App可以在

Locked Screen情形下还能继续执行,让我觉得非常有趣而且也带进了很多观念,所以我想把它做个更详细的说明,

协助我自己在阅读上更能快速掌握。

先强调一个观念,所谓的支持Locked Screen下的运行:

“目前App正在执行,按下了Locked Screen的任务;或者是App在执行一段时间后,手机自动进入Locked Screen任务。”

这个是要先厘清的部分,支持的功能不是App在执行按了Windows键或Back键还能Work的情形。

[注]

该篇文章的内容,透过WP7 Emulator的测试其实感觉不太出来,建议如果你有WP7设备的话,测试比较会有感觉。

另外,也许你可以修改WP7 Emulator文件来取得设定关闭屏幕的时间,也许这样会有不错的测试效果。

在说明WP7支持App跑在Locked Screen下之前,还是要再一次提到关于原本WP7对于App运行生命周期的定义:

〉基本WP7 App的生命周期

之前在 一文中,有提到整个WP7 App的LifeCycle,大家可以参考。

而整个LifeCycle里,重点在于:WP7的App在执行阶段,将会随著用户点选Back键、Start键、进入Locked Screen或涉及启动

其他Lanucher、Chooser,将目前App进行Closing或是Tombstoning。这二者处理的不同将会影响程序内容与用户操作的习惯。

〉运行在Locked Screen下的WP7 App生命周期

由上述WP7 App的生命周期得知进入Locked Screen模式,App会自动进入tombstoning,然而App就被暂时停止了。

所以要支持Locked Screen下运行的App,主要一个重点是:它不再执行tombstoning。 也就是说,它跳过了Deactived? Event的流程

然而,让App不进入Deactived Event处理,这就表示在Locked Screen下App仍然使用与Unlocked Screen下相同的内存与资源,

但其实这样是不必要的,因此,在进入Locked Screen后除了要让App可以Work,另一个重点就是能有效节省资源的使用量

?

根据 所提到几项关键技术即可以完成在Locked Screen下运行:

(1) 设定PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Disabled

(2) 处理App的RootFrame中二个重要事件:Obscured与Unobscured,分别处理Locked和Unlocked的任务

以下将分别说明:

-关键属性:“PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Disabled”

?PhoneApplicationService (Microsoft.Phone.Shell)

该类任务在管理整个应用程序生命周期中各种方面的情形,包括:管理应用程序闲置(idle)时的行为、应用程序的状态(state)的管

理(例如:应用程序的Launching、Closing、Activated、Deactived)…等,并且它控制整个App运行的属性与事件。该类的使用,可

以在项目中的“App.xaml.cs”中常看到。其中PhoneApplicatoinService有几个非常重要的属性:

名称 描述
ApplicationIdleDetectionMode 设定/取得应用程序闲置检测是否启动。Enabled该属性,当App进入Idle模式时,操作系统会deactive idle applicatoin。Disabled该属性,则代表系统不会执行Enabled该作的事,这将会影响电池的使用量与性能。

使用该属性要特别注意,因为即便进入Locked Screen下,App仍会消耗设备的电池。
更详细可以参考Idle Detection for Windows Phone。

使用的值是:IdleDetectionMode枚举。
Current (*) 取得PhoneApplicationService对象与当前的App实例

通常该PhoneApplicatoinService对象与App实例都是由WP7 OS自动产生的,所以控制的机会比较少,但关于Locked Screen下的运行,如何控制目前的PhoneApplicatoinService对象与实例就很重要。

更详细可参考Execution Model Best Practices for Windows Phone。
StartupMode 取得目前App启动的模式。由于App启动的模式可能来自Start按键后启动或执行App之间的互相调用等,而通常会被使用由XNA-based的App,因为它们需要监测程序是在Activated或Launching event被触发前后要进内联容或动作的转换。
State Dictioncary对象,用于保存当App进入Deactived event时,把目前App的资讯与内容暂存起来,等到回到Activated evetn在转出来。
UserIdleDetectionMode 设定/取得用户闲置检测是否启动。Enabled该属性,当用户闲置一段时间后,系统自动降低该App使用的资源与运行性能;相反Disabled该属性就不会执行上述的任务。

然而会使用Disabled的值,通常是在设计游戏上会使用,因为用户可能停止一段时间不操作手机(例如:等待下载、loading、动画等)。更详细可以参考Idle Detection for Windows Phone。

使用的值是:IdleDetectionMode枚举。

从以上的四个属性的说明,不难看出这次要实践的Locked Screen下继续运行的App该用的属性有那些了吧。没有错,就是最复杂的

“Current”属性。由于Current属性本身代表就是一个PhoneApplicatoinService实例后的对象,所以它也具有以上四个重要的属性。

为了支持让App在Locked Screen情形下仍然可以运行,就必须设定:“ApplicationIdleDetectionMode=IdleDetectionMode.Disabled”,

设定为Disabled之后,WP7 OS本身就不会自动在App进入Idle时,把App自动触发Deactived Event而变成Tombstone。这样一来,程序可以继续

执行,但程序如何结束与需要处理资源与性能的动作,变成要由开发人员来负责。

但要先注意一件事情,“ApplicationIdleDetectionMode被设定为Disabled时,没有办法把目前执行下转回Enabled,需要重新启动

该App才有办法设定(也就是PhoneApplicationFrame被初始化之后),否则会出现InvalidOperationException例外”。

另外,介绍二个用到的属性与类:

?IdleDetectionMode

成员名称 描述
Enabled UserIdleDetectionMode:当一阵子Touch Event没有触发,系统将会考虑将App转入Idle。
ApplicationIdleDetectionMode:当Lock screen被触发,系统将自动暂停App的活动。
Disabled UserIdleDetectionMode:当一阵子Touch Event没有触发,系统将不会考虑将App转入Idle。
ApplicationIdleDetectionMode:当Lock screen被触发,正在执行的App将持续执行。

?PhoneApplicationFrame (Microsoft.Phone.Controls)

由于WP7主要是以Silverlight页面模式运行,用户可以透过NavigationService来浏览不同Page中的内容,然而,其页面模式的主要核心内容是

一个Top-level的容器控件:PhoneApplicatoinFrame来管理Page的处理与浏览,另外它更可以控制PhoneApplicationPage控件。更详细相关页

页模式的运行可以参考:Frame and Page Navigation Overview for Windows Phone。

?

PhoneApplicationFrame管理目前App所有Page,因此,当Locked Screen被启动时,其实App被影响的就是Page中的内容与事件将会无法使用,

它类似在App上多加了一层薄膜(Locked程序)覆盖了原App上的Page,但是App上的PhoneApplicatoinFrame是有支持事件可以处理Locked Screen

所带来的触发事件。以下,将介绍二个重要的Event Handler,处理App进入Idle时的触发事件(Obscured)与由Idle进入App时触发事件(Unobscured)

?

-监测事件:“Obscured”与“Unobscured”

?Obscured / ObscuredEventArgs (EventHandler )

当Sell Chrome覆盖在Frame上时,触发该事件。举例来说:应用程序接收到Locked Screen事件时触发。

在Locked Screen下支持执行,代表App本身没有停止,只是上方多盖了一个Shell Chrome,在这个时候你是没有办法操作App画面上的功能,

所以建议可以把一些相关UI的特效、动画、网络连接(如果是Download功能的程序例外)等功能停止,降低手机电池的使用。

?Unobscured / EventArgs

当Shell Chrome不再覆盖在Frame上时,触发该事件。举例来说:当Locked Screen回到应用程序时触发。

由Locked Screen回到App时,盖在上面的Shell Chrome会消失,那么在Locked Screen时被停止的App上UI与功能都要被恢愎回来。

?

-------------------

以上提到的PhoneApplicationService、PhoneApplicatoinFrame类与Obscured、Unobscured事件处理都是要完成让App可支持在Screen锁定下,

仍可以继续执行的主要元素。

?

接着往下将简单介绍相关实践的程序:

?设定PhoneApplicationService.Current.ApplicationIdleDetectionMode与注册Obscured、Unobscured事件的处理。

1: if ( runsUnderLock ) 
2: { 
3:     //设定目前App的IdleDetectionMode=Disabled,让WP7 OS不会将程序转成tombstone
4:     PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Disabled;
5:? 
6:     //取得RootVisual,用来注册Obscured与Uobscured事件处理,客制App在Locked与Unlocked下要完成的任务
7:     PhoneApplicationFrame rootframe = App.Current.RootVisual as PhoneApplicationFrame ;
8:? 
9:     System.Diagnostics.Debug.Assert(rootframe != null, "This sample assumes RootVisual has been set"); 
10:     if (rootframe != null)
11:     {
12:         rootframe.Obscured += new EventHandler
 
 
  
  (rootframe_Obscured);
 
 
13:         rootframe.Unobscured += new EventHandler(rootframe_Unobscured);
14:     }
15:      
16: } 
17: else 
18: {
19:     IsRestartRequired = true;
20:     // we can not set it; we have to restart app ...
21:     // PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Enabled ;
22:     // 此段说明由于IdleDetectionMode不能在App执行时改变,因此,会另外启动一个EventHandler要求重启程序。
23:     EventHandler eh = RestartRequired;
24:     if (eh != null)
25:         eh(this, new EventArgs()); 
26: }


上述程序是撷取出 一文中:ApplicationIdleModeHelper.cs类里的部分程序,

用途在于:

(1) 随着RunsUnderLock属性值的设定,识别runsUnderLock变量是否App要设定为IdleDetectionMode.Disabled;

???? 如果是则设定;否则则通知要重新启动程序;

(2) 设定完毕之后,将设定值会被保存于IsolatedStorage中。

(3) 在下次在App启动时,将保存于IsolatedStorage中的Setting取出,进行识别再重新设定RunsUnderLock属性。

?

最后,更详细的范例内容,可以参考 一文中所提供的范例说明,

其范例透过Pivot来呈现二个不同的执行方式:

?在”greedy pivot”下

说明PhoneApplicationService.Current.ApplicationIdleDetectionMode设定Enabled与Disabled后,App在Locked下可以正常播放音乐;

?

?在”mellow pivot”下

透过Obscured与Unobscured事件实践,说明即使支持”Run? under lock”,在进入Locked后,音乐还是被关闭了,但等你Unlocked时,

音乐又自动播放了。强调如何实践在Locked下把App的功能暂时停止(不是进行tombstone"),目的在节省电池与性能的消耗。

?

?

[补充]

往下我补充在阅读程序时,遇到一些缺少的观念,所以在此先补足一些额外在开发上要注意与可以思考的部分:

INotifyPropertyChanged

INotifyPropertyChanged属于:System.ComponentModel,这个类常出现在针对客制出来的组件需要实践它背后属性异动时触发通知动作

一定会实践的重要界面。如果你有参考过 这本书,它里面几个范例也有使用该界面来实践撷取指定属

性变量的处理。实践该界面有什么好处?

?连动效果:INotifyPropertyChanged最常用于Data Bind时,处理一个控件的数据与影响下一个控件的情形。

?自动反应:支持该类的对象或类,只要实践该界面后在数据的处理上,都会自动反应在对应的控件属性上。

?

既然INotifyPropertyChanged有处理Data Bind让数据异动时,App知道如何去更动UI上的内容,那该实践那些东西呢?

?PropertyChangedEventHandler

该Event Handler是INotifyPropertyChanged必要实践的事件处理。它的任务通常用于往上通知某一项指定的属性被Modify了。

当控件接获到通知时,就会进行Bind Data的处理来因应属性调整后的结果。

实践范例可以参考:Bind Better with INotifyPropertyChanged。

?更详细的INotifyPropertyChanged的内容

我推荐 这一篇也蛮适合阅读,里面有提到ViewModel的定义与应用,

并且进一步说明INotifyPropertyChanged与DependencyObjects的关联。

?

-PhoneApplicationFrame与PhoneApplicationPage

http://msdn.microsoft.com/en-us/library/ff402536(v=VS.92).aspx

一个PhoneApplicationFrame内,包括了PhoneApplicationPage控件与其他丰富的其他Microsoft.Phone.Controls下的其他控件,

然而,PhoneApplicationPage控件负责管理目前Frame中Content Area里的所有任务与内容。

透过上图是最好解释整个Frame与Page的关系。

?

References:

?Running a Windows Phone Application under the lock screen

?wpf数据绑定,INotifyPropertyChanged vs DependencyProperty (—)

?INotifyPropertyChanged and WPF

?How to: Implement the INotifyPropertyChanged Interface

?PhoneApplicationPage Control for Windows Phone

?PhoneApplicationFrame Control for Windows Phone

?《Programming WPF》翻译 第4章 2.数据绑定(2)

?Base Controls for Windows Phone (Supported & Unsupported)

?Class Library Reference for Windows Phone

?

Dotblogs 的标签:PhoneApplicationService ,PhoneApplicationFrame ,PhoneApplicationPage


原文:大专栏  WP7 - Runing App under the Locked Screen详述

相关文章
相关标签/搜索