共用方式為


快速入門:建立並登錄背景工作 (HTML)

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

這個主題討論如何為應用程式建立並登錄背景工作的工作者。

先決條件

  • 擁有能夠立即提供背景工作的應用程式。

建立背景工作類別

建立個別的方法,其中包含在背景執行的程式碼。觸發特定事件時會執行這個程式碼。請閱讀 SystemTriggerMaintenanceTrigger 以取得任何應用程式都可以使用的觸發程序類型的清單。

下列步驟示範如何撰寫使用 Windows.UI.WebUI.WebUIBackgroundTaskInstance 的背景工作。開始之前,請先在 Microsoft Visual Studio 中建立一個新的空白 JavaScript 檔案。

  1. 在專案中建立一個新的 JavaScript 檔案。這個檔案中的函式和程式碼是將在背景執行的函式和程式碼。

    下列基本架構程式碼可以協助您開始撰寫:

    
    //
    // A JavaScript background task is specified in a .js file. The name of the file is used to
    // launch the background task.
    //
    (function () {
        "use strict";
    
        //
        // This var is used to get information about the current instance of the background task.
        //
        var backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current;
    
    
        //
        // This function will do the work of your background task.
        //
        function doWork() {
            var key = null,
                settings = Windows.Storage.ApplicationData.current.localSettings;
    
            // Write JavaScript code here to do work in the background.
    
    
            //
            // Record information in LocalSettings to communicate with the app.
            //
            key = backgroundTaskInstance.task.taskId.toString();
            settings.values[key] = "Succeeded";
    
            //
            // A JavaScript background task must call close when it is done.
            //
            close();
        }
    
        doWork();
    
    })();
    
  2. 背景工作應該要能辨識使用者要求停止工作。首先,請為 "canceled" 事件新增事件接聽程式,然後新增一個名為 "canceled" 的變數來傳送訊號給背景工作。

    背景工作範例會以 onCanceled 函式接聽 "canceled" 事件:

        var cancel = false;
    
        //
        // Associate a cancellation handler with the background task.
        //
        function onCanceled(cancelSender, cancelReason) {
            cancel = true;
        }
        backgroundTaskInstance.addEventListener("canceled", onCanceled);
    

    接著,請修改您的程式碼,讓它在 canceled 設定為 true 時停止工作並關閉。

    背景工作範例會建立一個名為 SampleBackgroundTask 的工作:

    
    //
    // A JavaScript background task is specified in a .js file. The name of the file is used to
    // launch the background task.
    //
    (function () {
        "use strict";
    
        //
        // This var is used to get information about the current instance of the background task.
        //
        var backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current;
    
    
        //
        // This function will do the work of your background task.
        //
        function doWork() {
            var key = null,
                settings = Windows.Storage.ApplicationData.current.localSettings;
    
            //
            // TODO: Write your JavaScript code here to do work in the background.
            // If you write a loop or callback, remember  have it check for canceled==false.
            //
    
            //
            // Record information in LocalSettings to communicate with the app.
            //
            key = backgroundTaskInstance.task.taskId.toString();
            settings.values[key] = "Succeeded";
    
            //
            // A JavaScript background task must call close when it is done.
            //
            close();
        }
    
        if (!canceled) {
            doWork();
        } else {
            //
            // Record information in LocalSettings to communicate with the app.
            //
            key = backgroundTaskInstance.task.taskId.toString();
            settings.values[key] = "Canceled";
    
            //
            // A JavaScript background task must call close when it is done.
            //
            close();
        }
    
    })();
    
  3. 確保您的背景工作會在每次完成工作或被取消時呼叫內建的 close() 方法。如果背景工作沒有自行關閉,則即使背景工作已完成,背景工作的處理程序仍然會繼續存在,並耗用記憶體和電池使用時間。

    請在每次 JavaScript 背景工作完成工作或被取消時,都呼叫 close():

    
    close();
    

下列步驟可將程式碼新增到您現有的應用程式 (例如 default.js)。

注意  您也可以建立專門用來登錄背景工作的函式,請參閱如何登錄背景工作。在這種情況下,您不需要使用以下三個步驟;只需建構觸發程序,並將它和工作名稱、工作進入點及 (選用) 條件提供給登錄函式即可。

 

登錄背景工作

  1. 逐一查看 BackgroundTaskRegistration.allTasks 屬性,以了解是否已經登錄背景工作。這個步驟很重要;如果您的應用程式不會檢查現有背景工作的登錄情況,就很容易多次登錄同一工作,因而造成效能問題,且將耗費大量 CPU 時間才能完成工作。

    下列範例會逐一查看 allTasks 屬性,並在工作已經登錄時,將旗標變數設為 true:

    var taskRegistered = false;
    var exampleTaskName = "Example background task worker name";
    
    var background = Windows.ApplicationModel.Background;
    var iter = background.BackgroundTaskRegistration.allTasks.first();
    
    while (iter.hasCurrent) {
    
        var task = iter.current.value;
    
        if (task.name === exampleTaskName) {
    
            taskRegistered = true;
            break;
        }
    
        iter.moveNext();
    }
    
  2. 如果尚未登錄,可呼叫 register 函式,並傳入背景工作檔案名稱及 SystemTrigger,以登錄背景工作。

    背景工作觸發程序會控制背景工作將在何時執行。請參閱 SystemTrigger 以取得可能的系統觸發程序清單。

    
    if (taskRegistered != true) {
    
        var builder = new Windows.ApplicationModel.Background.BackgroundTaskBuilder();
    
        var trigger = new Windows.ApplicationModel.Background.SystemTrigger(Windows.ApplicationModel.Background.SystemTriggerType.timeZoneChange, false);
    
        builder.name = exampleTaskName;
        builder.taskEntryPoint = "js\\ExampleBackgroundTask.js";
        builder.setTrigger(trigger);
    
        var task = builder.register();
    }
    
  3. 您可以新增條件,以控制觸發程序事件發生後何時執行工作 (選用)。例如,如果您希望在使用者上線時執行工作,則可使用 UserPresent 條件。如需可用條件的清單,請參閱 SystemConditionType

    注意  

    從 Windows 8.1 開始,背景工作登錄參數都是在登錄時驗證。如果有任一個登錄參數無效,就會傳回錯誤。您的應用程式必須能夠處理背景工作登錄失敗的狀況,例如使用條件式陳述式來檢查登錄是否有錯誤,接著使用不同的參數值來重試已失敗的登錄。

     

    if (taskRegistered != true) {
    
        var builder = new Windows.ApplicationModel.Background.BackgroundTaskBuilder();
    
        var trigger = new Windows.ApplicationModel.Background.SystemTrigger(Windows.ApplicationModel.Background.SystemTriggerType.timeZoneChange, false);
    
        builder.name = exampleTaskName;
        builder.taskEntryPoint = "js\\ExampleBackgroundTask.js";
        builder.setTrigger(trigger);
    
        builder.addCondition(new Windows.ApplicationModel.Background.SystemCondition(Windows.ApplicationModel.Background.SystemConditionType.userPresent));
    
        var task = builder.register();
    }
    

    注意  

    就「Windows Phone 市集」應用程式而言,在嘗試登錄任何背景工作之前,您都必須先呼叫 RequestAccessAsync。在 Windows 上,只有當一組背景工作需要應用程式在鎖定畫面上才能執行時,才需要進行這個呼叫,但是在 Windows Phone 上,登錄任何背景工作之前,都必須先呼叫一次這個方法。

    為了確保您的 Windows Phone 應用程式會在您發行更新之後繼續正常執行,您必須呼叫 RemoveAccess,然後在應用程式於更新後啟動時呼叫 RequestAccessAsync。如需詳細資訊,請參閱背景工作的指導方針 (HTML)

處理背景工作完成

您的應用程式可以在應用程式每次啟用時登錄「已完成」事件接聽程式,觀察背景工作的進度和完成。

  1. 撰寫應用程式可以用來辨識背景工作者完成的函式。

    背景工作範例會新增名為 onCompleted 的函式:

    
    //
    // Handle background task completion.
    //
    "completeHandler": function (task) {
        this.onCompleted = function (args) {
            try {
                var key = task.taskId;
                var settings = Windows.Storage.ApplicationData.current.localSettings;
                var status = settings.values[key];
    
                switch (task.name) {
                    case BackgroundTaskSample.sampleBackgroundTaskName:
                        BackgroundTaskSample.sampleBackgroundTaskStatus = status;
                        SampleBackgroundTask.updateUI();
                        break;
                    case BackgroundTaskSample.sampleBackgroundTaskWithConditionName:
                        BackgroundTaskSample.sampleBackgroundTaskWithConditionStatus = status;
                        SampleBackgroundTaskWithCondition.updateUI();
                        break;
                    case BackgroundTaskSample.servicingCompleteTaskName:
                        BackgroundTaskSample.servicingCompleteTaskStatus = status;
                        ServicingComplete.updateUI();
                        break;
                    case BackgroundTaskSample.javaScriptBackgroundTaskName:
                        BackgroundTaskSample.javaScriptBackgroundTaskStatus = status;
                        JavaScriptBackgroundTask.updateUI();
                        break;
                    case BackgroundTaskSample.timeTriggerTaskName:
                        BackgroundTaskSample.timeTriggerTaskStatus = status;
                        TimeTriggerBackgroundTask.updateUI();
                        break;
                }
            } catch (ex) {
                //WinJS.log && WinJS.log(ex, "sample", "status");
            }
        };
    }
    
  2. 使用函式訂閱「已完成」事件接聽程式。

    背景工作範例會將 onCompleted 新增至「已完成」事件:

    
    task.addEventListener("completed", new BackgroundTaskSample.completeHandler(task).onCompleted);
    

宣告您的應用程式有使用應用程式資訊清單的背景工作

您必須先在應用程式資訊清單中宣告每一個背景工作 (及其使用的觸發程序),應用程式才能實際登錄背景工作。

  • 開啟應用程式資訊清單,然後移至 Extensions 元素。將分類設定成 "windows.backgroundTasks",為應用程式使用的每一個背景工作類別新增一個 Extension 元素。您必須列出背景工作所使用的每一個觸發程序類型 - 您的應用程式無法使用未宣告的觸發程序類型來登錄背景工作。

    背景工作範例會登錄三個背景工作工作者:

    
    <Extension Category="windows.backgroundTasks" StartPage="js\backgroundtask.js">
      <BackgroundTasks>
        <Task Type="systemEvent" />
      </BackgroundTasks>
    </Extension>
    <Extension Category="windows.backgroundTasks" EntryPoint="Tasks.SampleBackgroundTask">
      <BackgroundTasks>
        <Task Type="systemEvent" />
        <Task Type="timer" />
      </BackgroundTasks>
    </Extension>
    <Extension Category="windows.backgroundTasks" EntryPoint="Tasks.ServicingComplete">
      <BackgroundTasks>
        <Task Type="systemEvent" />
      </BackgroundTasks>
    </Extension>
    

摘要

您現在應該了解如何撰寫背景工作類別的基本概念,如何在應用程式內登錄背景工作,以及如何讓應用程式辨識背景工作已經完成。您也應該了解如何更新應用程式資訊清單,作業系統才能讓應用程式登錄背景工作。

注意  您可以下載背景工作範例,以查看使用背景工作的完整、可靠 JavaScript 應用程式內容中的這些程式碼範例 (及更多內容)。

 

相關主題

詳細的背景工作說明主題

如何使用背景工作回應系統事件

如何登錄背景工作

如何設定執行背景工作的條件

如何使用維護觸發程序

如何處理已取消的背景工作

如何監視背景工作進度和完成

如何在計時器上執行背景工作

背景工作指引

背景工作的指導方針和檢查清單

如何偵錯背景工作

如何在 Windows 市集 app 觸發暫停、繼續以及背景事件 (偵錯時)

背景工作 API 參考

Windows.ApplicationModel.Background