一、重寫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();
- }
- }
-
}
那麼,處理這兩個事件幹嗎?各位還記得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,我們在“輸出”窗口中看到的是“程序未運行”。哦?這是爲什麼呢?程序運行了,怎麼會未運行呢?
看清楚了,args.PreviousExecutionState屬性指的是應用程序被激活時的“前一個狀態”,我們第一次運行程序,
那麼它的前一個狀態當然是未運行了。
在“調試位置”(這個估計翻譯問題,其實也挺難翻譯的)中,在下拉列表中選擇“掛起”,這樣我們可以模擬應用
程序掛起。
選擇後,再點一下“掛起”,這時候,應用程序已經掛起。
接着,再選擇“繼續”。
再點擊一下“繼續”,這時候,將模擬應用程從掛起狀態恢復。
我們發現,在“掛起”和“繼續”之間並沒有輸出內容。因爲在這兩個狀態切換之間,應用程序仍在運行,
也就是說,應用程序沒有執行OnLaunched方法。
這時候,我們點擊“開始”,回到開始屏幕,並切換到Windows桌面,然後把鼠標移到左上角,當看到
應用程序的窗口時,把它拖進桌面,不要鬆開鼠標,直接向下扔,就像扔垃圾一樣。這樣,就關閉了
應用程序。當然,還有一種方法,當鼠標移到屏幕左上角,當看到應用程序縮略圖時,右擊,從
彈出菜單中選擇“關閉”也可以關閉應用程序。
這樣,應用程序是被用戶關閉了的,接着,回到VS,稍等一下,等調試結束後,按F5再次運行。
看看這回會輸出什麼?
因爲剛纔我們通過用戶操作終止應用程序,再次運行,OnLaunched方法被執行,這時候,輸出內
容爲“應用程序被用戶關閉”,即前一個狀態。
就像當初模板生成的代碼一樣,保存和恢復狀態數據,只關注Launch和Suspend兩個行爲即可,
上面的試驗說明,應用程序被激活有兩個狀態:掛起後終止,用戶關閉。這兩種情況下我們需要恢復
相關數據,即
ApplicationExecutionState.TerminatedApplicationExecutionState.ClosedByUser
其實,按照VS生成的代碼模板和註釋提示處理即可,這裏我只是爲了演示才修改了代碼。