win8開發(2)——應用程序生命週期

創建Win8“板磚”應用後,我們不妨關注一下App類。在生成的代碼中我們可以看到,主要處理了兩個事件:
一、重寫OnLaunched方法;
二、處理Suspending事件。
App類的代碼如下,這是項目模板生成的。

  • namespace MyApp  
  • {  
  •     /// <summary>   
  •     /// 提供特定於應用程序的行爲,以補充默認的應用程序類。   
  •     /// </summary>   
  •     sealed partial class App : Application  
  •     {  
  •         /// <summary>   
  •         /// 初始化單一實例應用程序對象。這是執行的創作代碼的第一行,   
  •         /// 邏輯上等同於 main() 或 WinMain()。   
  •         /// </summary>   
  •         public App()  
  •         {  
  •             this.InitializeComponent();  
  •             this.Suspending += OnSuspending;  
  •         }  
  •   
  •         /// <summary>   
  •         /// 在應用程序由最終用戶正常啓動時進行調用。   
  •         /// 當啓動應用程序以執行打開特定的文件或顯示搜索結果等操作時   
  •         /// 將使用其他入口點。   
  •         /// </summary>   
  •         /// <param name="args">有關啓動請求和過程的詳細信息。</param>   
  •         protected override void OnLaunched(LaunchActivatedEventArgs args)  
  •         {  
  •             Frame rootFrame = Window.Current.Content as Frame;  
  •   
  •             // 不要在窗口已包含內容時重複應用程序初始化,   
  •             // 只需確保窗口處於活動狀態   
  •             if (rootFrame == null)  
  •             {  
  •                 // 創建要充當導航上下文的框架,並導航到第一頁   
  •                 rootFrame = new Frame();  
  •   
  •                 if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)  
  •                 {  
  •                     //TODO: 從之前掛起的應用程序加載狀態   
  •                 }  
  •   
  •                 // 將框架放在當前窗口中   
  •                 Window.Current.Content = rootFrame;  
  •             }  
  •   
  •             if (rootFrame.Content == null)  
  •             {  
  •                 // 當未還原導航堆棧時,導航到第一頁,   
  •                 // 並通過將所需信息作爲導航參數傳入來配置   
  •                 // 參數   
  •                 if (!rootFrame.Navigate(typeof(MainPage), args.Arguments))  
  •                 {  
  •                     throw new Exception("Failed to create initial page");  
  •                 }  
  •             }  
  •             // 確保當前窗口處於活動狀態   
  •             Window.Current.Activate();  
  •         }  
  •   
  •         /// <summary>   
  •         /// 在將要掛起應用程序執行時調用。在不知道應用程序   
  •         /// 將被終止還是恢復的情況下保存應用程序狀態,   
  •         /// 並讓內存內容保持不變。   
  •         /// </summary>   
  •         /// <param name="sender">掛起的請求的源。</param>   
  •         /// <param name="e">有關掛起的請求的詳細信息。</param>   
  •         private void OnSuspending(object sender, SuspendingEventArgs e)  
  •         {  
  •             var deferral = e.SuspendingOperation.GetDeferral();  
  •             //TODO: 保存應用程序狀態並停止任何後臺活動   
  •             deferral.Complete();  
  •         }  
  •     }  
  • }  
73

那麼,處理這兩個事件幹嗎?各位還記得Windows Phone開發的時候,我們說到的應用程序狀態嗎?在應用程序掛起或者

結束後,狀態信息有可能會丟失,我們會在適當的時候保存狀態信息,在必要時恢復。

現在我們把OnLaunched方法改一下,修改後如下所示。

[csharp] view plaincopyprint?

  • protected override void OnLaunched(LaunchActivatedEventArgs args)  
  • {  
  •     /*------------------------------------------------------------------------------------*/  
  •     // 判斷前一個狀態   
  •     string State = string.Empty;  
  •     switch (args.PreviousExecutionState)  
  •     {  
  •         case ApplicationExecutionState.ClosedByUser:  
  •             State = string.Format("{0} - 應用程序被用戶關閉。", DateTime.Now.ToString("HH:mm:ss"));  
  •             break;  
  •         case ApplicationExecutionState.NotRunning:  
  •             State = string.Format("{0} - 應用程序未運行。", DateTime.Now.ToString("HH:mm:ss"));  
  •             break;  
  •         case ApplicationExecutionState.Running:  
  •             State = string.Format("{0} - 應用程序正在運行。", DateTime.Now.ToString("HH:mm:ss"));  
  •             break;  
  •         case ApplicationExecutionState.Suspended:  
  •             State = string.Format("{0} - 應用程序被掛起。", DateTime.Now.ToString("HH:mm:ss"));  
  •             break;  
  •         case ApplicationExecutionState.Terminated:  
  •             State = string.Format("{0} - 應用程序終止運行。", DateTime.Now.ToString("HH:mm:ss"));  
  •             break;  
  •         default:  
  •             State = "無";  
  •             break;  
  •     }  
  •     System.Diagnostics.Debug.WriteLine(State);  
  •     /*------------------------------------------------------------------------------------*/  
  •        ……              
  • }  

要理解某一東西,最好的方法,莫過於親自來試一試。

按F5運行應用程序,注意看“輸出”窗口,如果沒有打開“輸出”窗口,在程序運行後,回到VS,從“調試”菜單下的“窗

口”裏面找。

當程序運行後,再回到VS,我們在“輸出”窗口中看到的是“程序未運行”。
1.png 

哦?這是爲什麼呢?程序運行了,怎麼會未運行呢?

看清楚了,args.PreviousExecutionState屬性指的是應用程序被激活時的“前一個狀態”,我們第一次運行程序,

那麼它的前一個狀態當然是未運行了。

在“調試位置”(這個估計翻譯問題,其實也挺難翻譯的)中,在下拉列表中選擇“掛起”,這樣我們可以模擬應用

程序掛起。


2.png 

選擇後,再點一下“掛起”,這時候,應用程序已經掛起。
接着,再選擇“繼續”。


3.png 

再點擊一下“繼續”,這時候,將模擬應用程從掛起狀態恢復。

我們發現,在“掛起”和“繼續”之間並沒有輸出內容。因爲在這兩個狀態切換之間,應用程序仍在運行,

也就是說,應用程序沒有執行OnLaunched方法。


這時候,我們點擊“開始”,回到開始屏幕,並切換到Windows桌面,然後把鼠標移到左上角,當看到

應用程序的窗口時,把它拖進桌面,不要鬆開鼠標,直接向下扔,就像扔垃圾一樣。這樣,就關閉了

應用程序。當然,還有一種方法,當鼠標移到屏幕左上角,當看到應用程序縮略圖時,右擊,從

彈出菜單中選擇“關閉”也可以關閉應用程序。


4.png 

這樣,應用程序是被用戶關閉了的,接着,回到VS,稍等一下,等調試結束後,按F5再次運行。

看看這回會輸出什麼?


5.png 


因爲剛纔我們通過用戶操作終止應用程序,再次運行,OnLaunched方法被執行,這時候,輸出內

容爲“應用程序被用戶關閉”,即前一個狀態。


就像當初模板生成的代碼一樣,保存和恢復狀態數據,只關注Launch和Suspend兩個行爲即可,

上面的試驗說明,應用程序被激活有兩個狀態:掛起後終止,用戶關閉。這兩種情況下我們需要恢復

相關數據,即

ApplicationExecutionState.Terminated
ApplicationExecutionState.ClosedByUser
其實,按照VS生成的代碼模板和註釋提示處理即可,這裏我只是爲了演示才修改了代碼。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章