WP7应用程序的生命周期指的是一个应用程序在启动、关闭、墓碑化、休眠(7.1更新)或运行中的各种状态和他们之间的关系。
在WP7.0时代是不支持多任务的,只有墓碑化处理----由开发者保存应用程序当前需要保存的部分状态,在回退的时候对所保存的这些状态进行恢复,这样来达到使用户感觉不到程序被关闭的体验。其实在墓碑化的过程中,应用程序已经被杀死,只由开发者保存了部分状态在隔离存储空间或内存中(回退栈信息)。到了WP7.1时,加入了;另外一个概念:休眠,也就有了现在的伪多任务。
休眠状态是当我们在程序中点击Win键进入到主界面,或者是在程序中使用了启动器和选择器启动了另一个程序时会发生。休眠状态时,程序停止运行(和墓碑相同),但程序还是存在于内存中(和墓碑不同)。当恢复这个程序时,就不需要创建一个新的实例(墓碑需要创建新实例)。这样就加快了程序恢复和切换的速度。而且从休眠状态恢复时我们不需要去恢复数据。在WP7.1中,我们可以长按Back按钮,出现程序列表,然后选择要前台执行的程序。休眠状态程序存在于内存中会占用部分资源,当前台程序运行时内存不够或程序不能流畅运行时,系统会自动将部分休眠状态程序转化为墓碑状态。在内存足够并且前台程序能够流畅运行时对休眠状态程序的个数也是有限制的,最多只能同时存在5个休眠程序,超过5个会自动将前面的程序转化为墓碑状态。
WP7中只有BACK一种方法可以退出程序,微软没有提供在程序中EXIT的代码(只有NavigationService.GoBack())。我们的程序在恢复时可能是从休眠或者墓碑两种状态中的一种来恢复,当从休眠状态恢复时,我们不需要恢复保存的数据,从墓碑状态恢复时,需要恢复保存的数据。WP7.1为我们提供了IsApplicationInstancePreserved参数来判断程序是从休眠状态还是墓碑状态恢复的(后面我们会通过代码来描述),有了这个参数我们就可以判断什么时候恢复数据,什么时候不需要恢复数据。
那么我们通过代码怎么来实现数据的保存和恢复,什么时候来保存和回复呢?我们主要用到了下面6个函数:
App.xaml.cs:Application_Launching
App.xaml.cs:Application_Closing
App.xaml.cs:Application_Deactivated
App.xaml.cs:Application_Activated
Page.cs:OnNavigationFrom
Page.cs:OnNavigationTo
Application_Launching方法在程序启动时调用,在程序从休眠或墓碑状态恢复时不调用,我们可以用这个函数来加载一些耗时时间极短的信息(比如一些***的配置信息)以免造成用户体验差。
- private void Application_Launching(object sender, LaunchingEventArgs e)
- {
- using (IsolatedStorageFile Iso = IsolatedStorageFile.GetUserStoreForApplication())
- {
- if(IsolatedStorageSettings.ApplicationSettings.Contains(IsoSetting1))
- {
- IsoContext = IsolatedStorageSettings.ApplicationSettings[IsoSetting1] as string;
- }
- }
- }
Application_Closing方法在程序关闭时调用,在程序从休眠或墓碑状态恢复时不调用,我们可以用这个函数来保存一些信息。
- private void Application_Closing(object sender, ClosingEventArgs e)
- {
- using (IsolatedStorageFile Iso = IsolatedStorageFile.GetUserStoreForApplication())
- {
- IsolatedStorageSettings.ApplicationSettings[IsoSetting1] = IsoContext;
- }
- }
Application_Deactivated方法在程序失去激活时调用,在程序关闭时不调用,我们可以使用这个方法来保存当程序进入墓碑化时需要保存的一些程序级信息,通过Application的state来保存。
- private void Application_Deactivated(object sender, DeactivatedEventArgs e)
- {
- PhoneApplicationService.Current.State[IsoSetting1] = IsoContext;
- }
Application_Activated方法在程序被重新激活时(即从墓碑或休眠状态激活时)调用,在程序启动时不调用。我们可以使用这个方法来恢复程序从墓碑化激活时需要恢复的一些程序级信息,通过IsApplicationInstancePreserved参数来判断程序是通过墓碑还是休眠状态来恢复的。
- private void Application_Activated(object sender, ActivatedEventArgs e)
- {
- if (!e.IsApplicationInstancePreserved)
- {
- IsoContext = PhoneApplicationService.Current.State[IsoSetting1] as string;
- }
- }
OnNavigationFrom方法在离开该页面时调用,我们可以用这个方法来保存一些页面级的信息。通过Page的state来保存。
- protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
- {
- base.OnNavigatedFrom(e);
- if (e.NavigationMode != System.Windows.Navigation.NavigationMode.Back)
- {
- State[numsetting1] = num;
- }
- }
OnNavigatedTo方法在进入该页面时调用,我们可以用这个方法来恢复一些页面级的信息。
- protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
- {
- base.OnNavigatedTo(e);
- if (e.NavigationMode != System.Windows.Navigation.NavigationMode.New)
- {
- if (State.ContainsKey(numsetting))
- {
- num = State[numsetting] as string;
- }
- }
- }
通过上面的代码,我们对应用程序的生命周期有了一定的了解,下面我们来简单总结一下应用程序生命周期部分流程。
***种:程序启动(Application_Launching)----进入主页面(OnNavigatedTo)----离开主页面(OnNavigationFrom)----程序直接通过BACK键关闭(Application_Closing)
第二种:程序启动(Application_Launching)----进入主页面(OnNavigatedTo)----离开主页面(OnNavigationFrom)----进入休眠状态(Application_Deactivated)----从休眠中恢复(Application_Activated)----进入主页面(OnNavigatedTo)----离开主页面(OnNavigationFrom)----程序直接通过BACK键关闭(Application_Closing)
第三种:程序启动(Application_Launching)----进入主页面(OnNavigatedTo)----离开主页面(OnNavigationFrom)----进入休眠状态(Application_Deactivated)----进入墓碑状态(Application_Deactivated)----从墓碑中恢复(Application_Activated)----进入主页面(OnNavigatedTo)----离开主页面(OnNavigationFrom)----程序直接通过BACK键关闭(Application_Closing)
原文链接:http://www.cnblogs.com/Kingly/archive/2012/02/22/2363393.html