淺談Windows Phone應用程序生命周期
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























