如何處理應用程式啟用 (HTML)

[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]

了解如何定義 Windows 執行階段應用程式的啟用經驗。

每當應用程式啟動時,就會引發 activated 事件。當應用程式正在執行時,如果系統需要傳遞與新啟用協定相關的應用程式參數時,也會引發這個事件。您可以使用 activated 事件來還原應用程式先前的狀態,以及抓取與要啟動應用程式的協定相關的啟用參數。如需啟用協定的完整清單及參數的更多詳細資訊,請參閱 ActivationKind 列舉。

下列步驟將示範如何登錄 activated 事件、用它來還原一些基本應用程式狀態,以及用它從磚處理預設啟用。

指示

步驟 1: 登錄啟用的事件

在全域範圍中登錄 activated 事件。這個範例會將 activatedHandler 設定成啟用處理常式。啟用處理常式可讓您抓取應用程式先前的 ApplicationExecution 狀態與啟用引數。如需啟用類型的清單,請參閱 ActivationKind 列舉。


var app = WinJS.Application;

app.addEventListener("activated", activatedHandler, false);
app.start();

步驟 2: 如果您的應用程式暫停並終止,還原應用程式資料

作業系統可以在暫停您的應用程式之後,基於一些原因來終止該應用程式。以下為發生此狀況的部分範例:使用者手動關閉您的應用程式、使用者登出,或者系統的資源不足。如果使用者在作業系統終止您的應用程式之後啟動它,會接收到 activated 事件。 使用 sessionState 物件,判斷您是否需要還原應用程式的資料,或是以預設值啟動。如果已定義您的 sessionState 變數,請使用它們來還原應用程式的資料,以及重新整理它的顯示內容。如果尚未定義這些變數,請載入您的預設值。

您也可以將 PreviousExecutionState 屬性用於事件引數,判斷您的應用程式是否應該還原狀態。如果這個屬性的 ApplicationExecutionState 值是 Terminated,您就應該還原狀態。如果是任何其他值,則應該載入應用程式的預設值。

注意   如果應用程式在啟用時已經在執行中,則您應該注意不會還原已儲存的資料。

 

function activatedHandler(eventArgs) {
   if (eventArgs.detail.kind == Windows.ApplicationModel.Activation.ActivationKind.launch) 
   {
      // Check whether my session state variables are valid.
      // If so, retrieve the application data saved in the checkpoint handler
      if (app.sessionState) 
      {
         // TODO: Populate the UI with the previously saved application data            
      } 
      else
      {
         // TODO: Populate the UI with defaults             
      }

   }
}

步驟 3: 如果在新電腦上啟動,查詢現有的次要磚

// Get secondary tile ids for the application and list them out

Windows.UI.StartScreen.SecondaryTile.findAllAsync().then(function (tiles) {
   if (tiles) {
      tiles.forEach(function (tile) {
         // Inspect the tile and do required work 
      });
   } 
   else {
      // there are no tiles 
      }
   });
}

步驟 4: 抓取啟用引數

當系統啟用您的應用程式時,啟用可能會有其他內容。

每個類型的啟用協定都會有一組自己獨特的參數,可以為您提供更多為什麼要啟用應用程式的資訊。每個協定的 eventArgs 類別都會定義於 Windows.UI.WebUI 命名空間中。這個程式碼片段說明如何從預設磚啟動中抓取參數。

function activatedHandler(eventArgs) {
    if (eventArgs.detail.kind == Windows.ApplicationModel.Activation.ActivationKind.launch) 
    {
        if (eventArgs.detail.arguments !== '')
        {
            // TODO: Parse the arguments string
        }
    // Initialize the WinJS controls
    eventArgs.setPromise(WinJS.UI.processAll();)

    }
}

步驟 5: 設定應用程式 UI

當您處理初始啟動的啟用時,在應用程式完成啟用之前,系統將會顯示啟動顯示畫面。在某些情況下,您的應用程式可能必須進行非同步工作 (例如,從檔案讀取設定),以便正確初始化它的 UI。這個工作需要在啟用期間完成,這樣才不會在 UI 完成之前,卸除啟動顯示畫面。您可以在啟用 eventArgs 上使用 setPromise() 方法,以延遲啟用的完成。在上述程式碼片段中,使用 setPromise() 來延遲啟用的完成,直到對於 processAll() 的非同步呼叫完成為止。

如果使用 Microsoft Visual Studio 範本,會為您呼叫 setPromise()。如果您具有在卸載啟動顯示畫面之前必須完成的非同步工作,請在新頁面片段的「已處理」事件期間完成這個工作。請確定您會從這個非同步動作傳回 Promise,以便在活動完成之前,延遲「已處理」事件的完成。每當您的應用程式瀏覽到特定的頁面片段時,就會呼叫這個已處理的事件,因此請確定所有啟用特定的程式碼都只會在因啟用而觸發的瀏覽中執行。在正常的瀏覽中,應該略過這個程式碼。

注意  啟動顯示畫面只是用來涵蓋設定初始 UI 所需的簡短活動。長時間執行的活動 (例如,對網路的呼叫或從磁碟載入大型檔案) 不應該在啟用期間完成。在這些情況下,您的應用程式應該在啟用期間設定進度 UI 或延伸的啟動顯示畫面,然後立即從啟用返回,同時還能在背景中繼續完成非同步操作。

 

processed: function (element, options) {
            // During an initial activation this event is called before activation completes.
            // Do any initialization work that is required for the initial UI to be complete.
            // Retrieve settings from a file
            return app.local.readText(settingsFile, "default").then(function (str){
                //use the settings to update the UI
            }, function () {
                //handle the error condition
               });
           },

ready:     function (element, options) {
            // During an initial activation this event is called after activation completes.
            // Do any initialization work that is not related to getting the initial UI set up.
           }

備註

應用程式啟動時,會在 DOMContentLoaded 事件之後與 WinJS.Application.onloaded 事件之前引發已啟用的事件。 如果應用程式正在執行,可能隨時引發已啟用的事件。

注意  如果您的應用程式因任何原因需要瀏覽至最上層文件,您必須先完成啟用,才能嘗試進行最上層瀏覽。如果在完成啟用前嘗試進行最上層瀏覽,您的應用程式就會當機。這可確保 JavaScript 內容在瀏覽期間關閉及重建前,您的應用程式與系統會處於一致的狀態。

 

注意  

就「Windows Phone 市集」應用程式而言,resuming 事件的後面一律跟著 activated 事件,即使在應用程式目前已被暫停,而使用者從主要磚或應用程式清單重新啟動應用程式的情況下,也是如此。如果目前的視窗中已有設定的內容,應用程式可以略過初始化程序。您可以檢查 LaunchActivatedEventArgs.TileId 屬性,以判斷應用程式是從主要磚還是次要磚啟動,然後根據該資訊,決定您是要呈現全新的應用程式體驗,還是繼續應用程式體驗。

完整範例

請參閱使用 WinJS 的應用程式啟用和暫停範例以及使用 WRL 的應用程式啟用、繼續及暫停範例,以取得可顯示如何處理應用程式週期事件的完整程式碼範例。

相關主題

工作

如何暫停應用程式

如何繼續應用程式

概念

應用程式週期

參考

Windows.ApplicationModel.Activation.ActivationKind

Windows.UI.WebUI.WebUILaunchActivatedEventArgs

WinJS.Application.activated