快速入門:建立並登錄背景工作 (HTML)
[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]
這個主題討論如何為應用程式建立並登錄背景工作的工作者。
先決條件
- 擁有能夠立即提供背景工作的應用程式。
建立背景工作類別
建立個別的方法,其中包含在背景執行的程式碼。觸發特定事件時會執行這個程式碼。請閱讀 SystemTrigger 和 MaintenanceTrigger 以取得任何應用程式都可以使用的觸發程序類型的清單。
下列步驟示範如何撰寫使用 Windows.UI.WebUI.WebUIBackgroundTaskInstance 的背景工作。開始之前,請先在 Microsoft Visual Studio 中建立一個新的空白 JavaScript 檔案。
在專案中建立一個新的 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(); })();
背景工作應該要能辨識使用者要求停止工作。首先,請為 "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(); } })();
確保您的背景工作會在每次完成工作或被取消時呼叫內建的 close() 方法。如果背景工作沒有自行關閉,則即使背景工作已完成,背景工作的處理程序仍然會繼續存在,並耗用記憶體和電池使用時間。
請在每次 JavaScript 背景工作完成工作或被取消時,都呼叫 close():
close();
下列步驟可將程式碼新增到您現有的應用程式 (例如 default.js)。
注意 您也可以建立專門用來登錄背景工作的函式,請參閱如何登錄背景工作。在這種情況下,您不需要使用以下三個步驟;只需建構觸發程序,並將它和工作名稱、工作進入點及 (選用) 條件提供給登錄函式即可。
登錄背景工作
逐一查看 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(); }
如果尚未登錄,可呼叫 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(); }
您可以新增條件,以控制觸發程序事件發生後何時執行工作 (選用)。例如,如果您希望在使用者上線時執行工作,則可使用 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)。
處理背景工作完成
您的應用程式可以在應用程式每次啟用時登錄「已完成」事件接聽程式,觀察背景工作的進度和完成。
撰寫應用程式可以用來辨識背景工作者完成的函式。
背景工作範例會新增名為 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"); } }; }
使用函式訂閱「已完成」事件接聽程式。
背景工作範例會將 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 參考