快速入门:创建和注册后台任务 (HTML)
[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]
本主题讨论如何为你的应用创建和注册后台任务 Worker。
先决条件
- 具有准备用于提供后台任务的应用。
创建后台任务类
使用后台运行的代码创建一个单独的方法。该代码将在特定事件被触发时运行。有关任何应用均可使用的触发器类型的列表,请参阅 SystemTrigger 和 MaintenanceTrigger。
以下示例向你展示如何编写使用 Windows.UI.WebUI.WebUIBackgroundTaskInstance 的后台任务 Worker。在开始之前,请在 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(); })();
后台任务应该可以识别何时要求它停止工作。首先,添加用于“已取消”事件的事件侦听器,并添加名为“已取消”的变量来为后台任务提供信号。
后台任务示例将通过 onCanceled 函数侦听“已取消”事件:
var cancel = false; // // Associate a cancellation handler with the background task. // function onCanceled(cancelSender, cancelReason) { cancel = true; } backgroundTaskInstance.addEventListener("canceled", onCanceled);
然后,如果“已取消”设置为 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”)添加代码。
注意 你还可以创建专用于注册后台任务的函数 - 请参阅如何注册后台任务。在这种情况下,不使用接下来的 3 个步骤,你可以简单构造触发器并将其随任务名称、任务入口点以及(可选)条件一起提供给注册函数。
注册后台任务
通过在 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 应用在你发布更新后继续正常运行,你必须在启动已经过更新的应用时调用 RemoveAccess,然后调用 RequestAccessAsync。有关详细信息,请参阅后台任务指南 (HTML)。
处理后台任务完成
你的应用可以通过在每次应用激活时注册“completed”事件侦听器观察进度和后台任务的完成情况。
编写函数,以便你的应用可以使用该函数识别后台 Worker 的完成情况。
后台任务示例添加名为 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"); } }; }
订阅具有该函数的“completed”事件侦听器。
后台任务示例将 onCompleted 添加到“completed”事件:
task.addEventListener("completed", new BackgroundTaskSample.completeHandler(task).onCompleted);
在应用清单中声明你的应用使用后台任务
只有在应用清单中声明各个后台任务(以及使用的触发器)后,你的应用才能实际注册后台任务。
打开应用清单,然后转至 Extensions 元素。将类别设置为 "windows.backgroundTasks",为应用中所用的每个后台任务类添加一个 Extension 元素。你必须列出后台任务使用的各种触发器类型 - 你的应用无法使用未声明的触发器类型注册后台任务。
后台任务示例注册三种后台任务 worker:
<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 应用商店应用中触发暂停、恢复和后台事件(在调试时)
后台任务 API 引用