WP7 - Runing App under the Locked Screen详述
Windows Phone 7 – Runing App under the Locked Screen详述 在老狗分享了
Locked Screen情形下还能继续执行,让我觉得非常有趣而且也带进了很多观念,所以我想把它做个更详细的说明, 协助我自己在阅读上更能快速掌握。
先强调一个观念,所谓的支持Locked Screen下的运行: “目前App正在执行,按下了Locked Screen的任务;或者是App在执行一段时间后,手机自动进入Locked Screen任务。” 这个是要先厘清的部分,支持的功能不是App在执行按了Windows键或Back键还能Work的情形。
[注] 该篇文章的内容,透过WP7 Emulator的测试其实感觉不太出来,建议如果你有WP7设备的话,测试比较会有感觉。
在说明WP7支持App跑在Locked Screen下之前,还是要再一次提到关于原本WP7对于App运行生命周期的定义: 〉基本WP7 App的生命周期 之前在
而整个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,另一个重点就是能有效节省资源的使用量。 ? 根据
(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有几个非常重要的属性:
从以上的四个属性的说明,不难看出这次要实践的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
?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 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: } 上述程序是撷取出
用途在于: (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的内容 我推荐
并且进一步说明INotifyPropertyChanged与DependencyObjects的关联。 ? -PhoneApplicationFrame与PhoneApplicationPage 一个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详述 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Windows系统CPU内存网络性能统计第四篇 CPU 多核CPU各核使用
- 在Windows操作系统的文件管理器中集成Azure DevOps Server
- wix – 为什么在使用MSI时限制文件部署到用户配置文件或HKC
- WPE使用实例
- 调试 – 在windbg中,什么可能导致消息“警告:无法验证mydl
- Windows使用TensorFlow-GPU导致IPython Notebook 崩溃问题
- Windows Server 2016-Win Ser 2016已删减内容
- 机器人 – Microsoft Bot Framework – 如何更改演示文稿消
- window 下 bat 计划任务删除保留时间内文件
- 如何在Windows DNS服务器上注册Linux服务器
- 如何使用WiX创建.msi安装程序
- 我可以使用带有Windows域身份验证的html5 Websoc
- windows-server-2008 – 从Win2008 R2中删除IIS
- winforms – 在XNA中使用system.windows.forms
- Windows – 网络应用程序的带宽和流量模拟器?
- Windows如何在系统调用期间切换到管理员模式?
- windows – Active Directory的备份
- Windows Azure SDK返回未知的AccountType:undef
- 批处理文件 – Windows批处理文件处理 – 循环
- windows-runtime – 图像源上的Uri格式