【翻译】Windows Phone运行模型概述

本篇翻译自MSDN Execution Model Overview for Windows Phone

原文链接http://msdn.microsoft.com/en-us/library/ff817008(v=VS.92).aspx

翻译:楼上那个男人

Windows Phone运行模型概述

Windows Phone运行模型管理整个应用程序的生命周期。从应用程序运行一直到结束。

       该运行模型意图提供给用户一个任何时刻均可快速响应的用户体验。为此,Windows Phone任何时候仅允许一个应用运行在前台。操作系统将不在前台运行的程序转入休眠状态(dormant state)。当设备可用内存不足以为前台程序的用户体验提供足够的资源时,操作系统会结束一些休眠状态的程序。较早进入休眠状态的程序会被优先结束掉。程序框架将提供对应用程序“激活”(reactivated),“失效”(deactivated )状态的管理。这将使用户感觉应用程序始终在运行,即使它们已经被“结束”(terminated)或“失效”(reactivated)。

       运行模型也负责在不同应用之间提供一致的导航体验。在Windows Phone上,用户向前导航(navigate forward)的操作包括:运行应用程序列表中安装的App,点击开始界面的瓷片(Tile),以及其他方式比如推送通知关联的应用程序。用户也可以向后导航(navigate backwards),在程序运行页面执行后退的逻辑,或者拖过点击物理的“Back”按钮。Windows Phone 7.5中,按住“Back”按钮,就可以选择之前运行的应用程序。

       本节提供了Windows Phone应用程序生命周期详细的解释,以及开发应用程序所需步骤的概述。包括快速响应和一致性导航的用户体验。在阅读这篇概述后,你可以进一步的阅读以后的章节,包括一些样例代码。

       尽管操作系统采用同样的方式管理所有的应用程序,但是在处理应用程序中断时,XNA游戏需要一些特别的考虑。如果你正在创建一个基于XNA的游戏,你应该阅读本节,以及Tombstoning for Windows Phone 7 Games.

术语


你应该先熟悉以下的术语和概念,在你阅读剩下的部分之前。

Application State

需要在多个页面重复使用的数据可以存放在Application State中。比如从Web Service获得的数据。你可能想要在不同页面以不同的形式来显示相同的数据,并且这些数据对整个应用程序来说是相同的。一种常见的错误是认为所有的Application State数据都应该在程序关闭时存储。其实在用户从当前页面离开时保存,通常是一个很好的注意。这将减少应用程序关闭时所要做的操作,改善用户体验。

Page State

用来存储单个页面的当前可视状态。比如你有一个包含接受用户输入控件的页面, 用户在离开了你的应用程序后,又再次返回。用户希望表单上所有的控件都保持离开前的值。应用程序应该管理Page State,在页面重新加载时恢复控件的值,给予用户应用仍在运行的良好体验。但是当用户运行一个新的应用程序实例时,则不应该用前一个实例的Page State来恢复新的实例。

Application Events

这里有四个主要的事件用户于应用程序状态管理: LaunchingDeactivatedActivated, 和 Closing。这些事件的处理方法已经在Visual Studio project的Windows Phone applications模板中包括了。如果你需要管理应用程序状态,你应该在App.xaml.cs中相应的事件处理方法中,添加自己的代码。

                                                                      重要提示:

所有的应用程序事件都有10秒的时间限制,应用程序必须在10秒内完成操作。如果用时超过10秒,程序将会被立即结束掉。因此, 在Application Events中,你应该避免频繁的操作资源, 比如读取和写入isolated storage。这些任务应该在应用程序创建后,在后台线程执行。在整个应用程序生命周期中,尽可能的立即保存已经改变的数据,减少你在application events中需要进行的状态管理操作。

Page Events

所有继承了PhoneApplicationPage对象的页面均暴露了两个方法,OnNavigatedTo(NavigationEventArgs)OnNavigatedFrom(NavigationEventArgs), 你的应用程序可以通过Override这两个方法来管理Page   State。

Tombstoning

当应用程序的进程结束时,一些状态数据和个别页面将会被保存。这些数据包括当前页面和之前访问的页面间的返回堆栈。如果用户向后导航(navigate backwards)至已经墓碑化的应用程序。该应用程序将会被重新创建,且当前页的状态和页面间的导航信息将被自动恢复。

State Dictionaries

每一个Windows Phone应用程序和页面都提供字典对象(Application   State和Page State),用以存储键值对。这些字典对象在程序进入墓碑状态(tombstoned)时被保存。当程序从墓碑状态(tombstoned)被激活(activated)时,这些字典对象用以恢复Application State和Page State。注意所有的这些数据都必须可以序列化!(否则无法存入,且不报错。)

The Windows Phone Application Lifecycle


下图说明了Windows Phone应用程序的生命周期。图中, 圆圈是应用程序状态。矩形显示了应用程序或页面级别的事件,你应该在这些事件中管理应用程序的状态。

 

本节讨论了Windows Phone应用程序生命周期,强调了每个步骤应该做的事情。本节提到了操作系统层面和用户操作对application state的影响。具体的事件列表及你的应用程序应该做的事情参看这里 Summary of Execution Model Events and Application Actions.

The Launching Event

Launching事件发生在用户创建一个新的应用程序实例时,比如从应用程序列表或Strart页面的瓷片(Tile)中运行程序,点击推送通知关联的应用,从照片库的扩展菜单中选择运行一个程序。当应用程序通过这些方式运行,应该呈现给用户一个新的实例,而不是之前的实例。未了确保你的应用程序可以快速的启动,你应该在Launching事件中写尽可能少的代码。特别是要避免资源密集型的任务,比如访问网络。为了最佳的用户体验,你应该在程序加载后,在后台线程运行这些任务。

Running

在应用程序创建后,程序将保持运行状态。直到用户向前导航(navigate forward)离开这个程序,或者从程序的第一个页面向后导航(navigate backwards)。Windows Phone应用程序不应该存在退出这样的概念. 在屏幕被锁定时,应用程序也应该离开运行状态(Running State),除非你已经关闭了application idle detection。请参阅 Idle Detection for Windows Phone.

The OnNavigatedFrom Method

当用户从页面离开时, OnNavigatedFrom(NavigationEventArgs) 方法将会被调用。除了在应用程序页面间导航切换时会触发外,应用程序“失效”时(deactivated)也会被调用。只要这个方法被调用,你就应该保存Page State,以保证用户返回该页面时,状态能被恢复。但向后导航(navigation backward)是个例外。NavigationMode属性可以被用来判断是否为向后导航(navigation backward),在这种情况下不需要保存状态,因为下次访问时,该页面又会重新走一遍创建的逻辑。

一些情况下,你可能也需要在OnNavigatingFrom(NavigatingCancelEventArgs)方法里保存状态。特别是你需要保存MediaElement控件的状态时。

The Deactivated Event

Deactivated事件发生在用户向前导航(navigates forward),通过按下Start按钮或运行其他程序来离开你的应用时。你的程序启动一个选择器(Chooser)时也会发生Deactivated事件。关于Choosers请参见Launchers and Choosers Overview for Windows Phone. 屏幕锁定时也会发生Deactivated事件,除非你已经关闭了application idle detection。

处理Deactivated事件,应用程序应该保存所有的状态,以便能够做到在短时间内恢复。Windows Phone应用程序提供了State对象, 以字典(dictionary)的形式来存储应用程序状态。如果应用程序从墓碑状态(tombstoned)被重新激活(reactivated),状态字典(state dictionary)将填充失效时(Deactivated)保存的数据。因为这些数据都是在内存中,所以你不用做任何文件操作就可以恢复应用程序状态。

在调用Deactivated事件后,应用程序有可能被彻底结束。状态字典(state dictionary)在程序结束时是不会被保存的。所以,你同样应该在Deactivated事件中保存那些需要持久化的应用程序数据到独立存储(isolated storage)中。

Dormant

当用户向前导航(navigates forward)离开应用程序,会调用失效(Deactivated)事件,之后操作系统将试图将应用程序转为休眠状态(dormant state)。在这种状态下,应用程序所有的线程将停止工作,但应用程序仍完整的保存在内存中。如果从休眠状态被激活(reactivated),应用程序不需要重建任何状态,因为程序一直完整的保存在内存中。

如果新的应用程序开始运行,并且需要更多的可用内存来提供足够好的用户体验。操作系统将墓碑化休眠的应用程序来释放内存。

Tombstoned

一个墓碑化(tombstoned)的应用程序实际已经被结束了。但失效(Deactivated)事件中保存的导航信息和状态字典依然存在。Windows Phone设备将同时维护最多5个应用程序的墓碑信息。如果用户向后导航(navigates back)到处于墓碑化(tombstoned)的应用程序,应用程序将被重新创建,并且使用保存的数据来恢复状态。另一方面,原来墓碑化的程序将被结束。

The Activated Event

当应用程序从休眠或墓碑状态返回时将调用Activated事件。应用程序可以检查事件参数中的IsApplicationInstancePreserved来判断是从休眠或是墓碑状态返回的。如果IsApplicationInstancePreserved为true,应用程序是处于休眠状态,操作系统将自动恢复程序状态。如果是false,则应用程序是从墓碑状态被恢复,应用程序应该使用状态字典中的数据来恢复程序状态。在Activated事件中,应用程序不应该执行资源密集型的任务,比如读取独立存储的数据(isolated storage),或者访问网络资源。因为这将增加应用程序恢复所花费的时间 ,这些操作应该在程序启动后,在后台线程中执行。

The OnNavigatedTo Method

用户导航(navigates)进入页面时调用OnNavigatedTo(NavigationEventArgs) 方法。包括应用程序首次运行,用户在页面间切换和从休眠或墓碑状态恢复。在该方法中,应用程序应该检查页面是否是一个新的实例。如果不是,页面状态就不需要恢复。如果是新的页面实例,并且状态字典中存在对应该页面的数据,则应该恢复页面UI到之前的状态。

The Closing Event

当用户从应用程序的第一个页面执行向后导航(navigates backwards)时,将调用Closing事件。在这种情况下,应用程序将被结束且不保存状态。在Closing事件的方法中,你的应用程序可以保存那些应该被持久化的数据。对所有的应用程序事件和页面事件的执行时间都有一个10秒的限制。如果时间超过这个限制,应用程序将被结束。因此,建议在整个应用程序生命周期中尽可能的进行保存状态的操作,来避免在Closing事件中处理大量的文件I/O操作。

Summary of Execution Model Events and Application Actions


下表总结了应用程序生命周期中会触发的事件,以及应用程序对应该事件应该采取的动作。

Event or method

Application action

Launching event

执行少量代码。不要做访问独立存储之类资源密集型的操作。

OnNavigatedFrom method

如果不是向后导航(backward navigation),保存界面状态(UI state)至State dictionary.

Deactivated event

当墓碑化应用程序时,保存application state至State。当应用程序结束时,保存需要持久化的数据至独立存储(isolated storage)。在应用程序处于休眠状态时,不要销毁内存中的application state。

Activated event

检查IsApplicationInstancePreserved。如果是true, 不用做任何事。如果是false, 使用State中的数据恢复application state。

OnNavigatedTo method

检查是否是新的页面实例。如果不是, 状态会自动恢复。否则使用State中的数据来恢复UI。

Closing event

保存需要持久化的数据至isolated storage。

      警告:

本节描述的事件提供了当应用程序从前台开始运行和离开时,保存和恢复应用程序状态的机制。无论如何,推荐的做法是在数据改变时立即保存。例如,一次web request的结果在到达时,就应该立即被保存到磁盘(disk)或者application state dictionary(或二者均需要)。你不应该等到失效事件(Deactivated)发生再保存数据。记住在应用程序生命周期中,事件存在10秒的强制限制。

     

 

posted @ 2011-12-20 23:31  楼上那个蜀黍  阅读(633)  评论(0编辑  收藏  举报