理解Windows Phone 7应用程序执行模型,墓碑机制,启动器和选择器及更多内容—Part 1
理解 Windows Phone 7应用程序执行模型,墓碑机制,启动器和选择器及更多内容 ——Part 1
作者: Yochay Kiriaty
本系列的文章起了一个如此长并十分响亮的名字,相信会很不错,当然这要由你来评判。然而,起这么长名字的原因很简单, 这些“大”词可以简要的概括执行模型的各个方面。如果你想不断提高应用程序的用户体验那么你就该弄懂它们。本文通过启动、运行和关闭一个Silverlight 应用程序的不同方面来逐步向你介绍Windows Phone (WP) 应用程序的执行模型。注意:对于XNA 游戏来说,这些术语和概念是一致的,只是有些实现上的微小差异。在后面的文章中我将介绍停用(deactivation ),重新激活(reactivation )以及启动器(launcher )和选择器(chooser )如何通过墓碑机制来工作。
随着最新的Beta 版Windows Phone 开发人员工具的发布,在Windows Phone 上执行的应用程序采用了更新的执行模型。现在,当你的应用程序从前台被移除时(另一个应用程序占据前台,如电话呼入或者屏幕锁定被激活),实际上它会被终止掉(在不久之后)。在Windows Phone 工具的早先版本中,如果你从一个应用切换到另一个应用,可能会碰到各种各样奇怪的情况。这是因为在原先版本的工具中,Windows Phone 操作系统并没有彻底终止你的程序,而是将它“暂停”了。但现在问题来了,是启动一个应用程序的新实例还是经由回退栈返回到原来的程序呢?更令人困惑的是,这些相关的事件和API 还不够完善。我想这正是我们看到技术预览版的原因——测试并修复这些“问题”。
基本规则
确保只有一个程序。到目前为止你也许已经知道Windows Phone 操作系统不允许第三方应用程序在后台运行。说的更具体些,就是在任何时间内只有一个应用程序能运行在前台,这意味如果你的应用程序没有在前台显示,那它就没有运行。不允许第三方应用程序在后台执行的最主要原因是为了维持电池的续航时间(参见 推送通知服务 )并确保提供一个能够快速响应并且一致的用户体验。
所有Windows Phone 设备都配备了一个返回按钮硬件。这个按钮除了有返回导航功能之外,还将支持应用程序之间的切换。这是一个非常酷的特性,不同于其他类型的手机,你可以从一 个应用程序导航至浏览器或者是另一个应用程序,然后再按下返回按钮便可流畅地回到你的应用程序。这将会在不同的应用程序上获得一个十分统一的用户体验,不 论是第三方应用程序还是手机内置的应用程序套件。这意味着Windows Phone 操作系统为你应用程序的行为维护了一个目录从而来支持返回按钮的功能。这就是回退栈 。
基础——启动,执行和关闭应用程序
是时候来看看Windows Phone 的执行模型了,对此最好的方式莫过于研究代码了。现在打开一个新的Windows Phone 应用程序并查看Windows Phone Silverlight 应 用程序模板自动生成的代码,你可以在App.xaml.cs 文件中找到4 个与执行模型直接相关的方法:
- Application_Launching
- Application_Activated
- Application_Deactivated
- Application_Closing
顺便说一下,所有这些事件(这些方法是事件处理程序)都是Microsoft.Phone.Shell 命名空间中PhoneApplicationService 类的成员。
我认为这些方法的名字已经完全可以自我解释了,但为了保险起见,让我来说明一下。我将在后面讲Activated 和Deactivated 事件;现在,来看两个简单的事件:Launching 和Closing 事件。我为每个方法(事件处理程序)添加了如下的一行代码:
- // Step 1 - Util is helper class for logging
- Util.Trace("***** in MainPage CTOR/t/t ( " + DateTime.Now.Ticks + " *****) ");
Util 是一个简单的有助于我们调试的辅助类。每个方法中的文字是根据事件而变化的,但你也可以自定义。我记下了每个事件发生的时间以便在后面说道Activated 和Deactivated 事件时用以证明。
在当前状态下执行程序可以得到预期的结果。应用程序一启动“Launching” 方法就被调用了。不出所料,此事件发生后,程序开始执行了。按下返回按钮(不是Windows 按钮)程序就终止了并且“Closing” 事件被触发。正如下图所示(截取自Visual Studio 的输出窗口)。
如我所述,通过按下返回按钮,导航模型允许用户“回到上一步”,或者回到前一个的程序页面,或者切换应用程序。然而一旦你回到了程序的第一页(第一个页面,或者程序的第一个实例)时按下返回按钮会触发Closing 事件并终止此程序。从上图可以清楚地看到,“程序”已经退出。如果你按本文所述在Visual Studio 中调试代码,你会注意到在模拟器中程序退出了并返回到了起始界面。
理解Activated 、Deactivated 事件和墓碑机制
到目前为止一切顺利,我的意思是还没有新的内容。现在,让我们来看看接下来的内容。在Visual Studio 的调试模式下执行你的程序(我们可以看到堆栈信息)。程序如预期的那样执行同时你会在日志中看到应用程序启动的跟踪信息。现在不按返回按钮(如果你按了,程序将被终止),而是按Windows 按钮(中间的按钮)。
注意下面几点:
- 模拟器返回到起始界面的同时你的应用程序从前台消失了,这意味着它不再运行了!
- Visual Studio 中的调试会话被终止掉。这说明Visual Studio 不再调试程序,因为程序已经停止运行了。
注意: 最终,你的程序终止了。我们很容易在Visual Studio 输出窗口中看到,正如输出窗口中状态的最后一行,“The program '[220921918] taskhost.exe: Managed' has exited with code 0 (0x0). ” 不过别担心,这种设计是有意为之。不同于前面的例子,这次在Launching 事件后面触发的是Deactivated, 而不是Closing 。不过无论是那种情况应用程序最终都会被终止。究竟发生了什么呢?Closing 和Deactivated 的区别是什么?更重要的是, 为什么会有这种差别?
- 应用程序关闭 (Application Closing ) 是用户多次按下返回按钮后导航至程序最初页面后的结果。现在,这是用户退出一个应用程序的唯一 途径。一旦应用程序关闭后,它所关联的进程便会被终止,操作系统会从内存(RAM )中移除掉此程序的所有信息。
- 应用程序停用(Application Deactivated ) 发生在当另一个不同的应用程序获取了前台控制权时——例如,一个来电,启动选择器,或者用户按下了Windows 按钮。在这些情况下,你的应用程序都将被停用(不是关闭 )。在探讨Deactivated 事件的妙处之前,我们要确保已经理解一旦停用,程序最终将会被终止。很简单:你的代码不能在后台执行,所以程序会终止执行。然而这和程序的退出不同,一个被停用的程序会被墓碑化处理。注意不要搞混了,一个墓碑化的应用程序它的进程已经终止。但不同于已退出的应用程序,Windows Phone 操作系统会清除它所有的堆栈信息。但应用程序停用后,Windows Phone 操作系统存储了应用程序当前状态的记录(墓碑)。通常,Windows Phone 操作系统维护的墓碑会成为手机应用程序回退栈的一部分,回退栈就是一个能增强返回按钮导航功能的记录。
应用程序可以通过下面几种方式被墓碑化处理。如果以下情况发生,一个应用程序将被墓碑化处理并且并被停用:
- 用户按下Windows 按钮(正如你所做的)。
- 设备超时导致屏幕锁定(还有,另一个应用程序接管了前台的控制权)。
- 用户调用了启动器或选择器——我们会在后面的文章中介绍。
在 应用程序生命周期的当前点(就是你的程序被墓碑化处理时),我们就可以执行一些操作了。用户可以返回到一个墓碑化的程序。如果用户执行了选择器和启动器动的行为并返回应用程序时这就会发生,或者如果用户多次按返回键从而返回到一个已停用(被墓碑化处理)的应用程序。不论用户如何返回到此程序,程序都将被重新激活(触发Activated 事件)
补充:移动开发 , Windows Phone ,