快速入门:创建和注册后台任务 (HTML)

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

本主题讨论如何为你的应用创建和注册后台任务 Worker。

先决条件

  • 具有准备用于提供后台任务的应用。

创建后台任务类

使用后台运行的代码创建一个单独的方法。该代码将在特定事件被触发时运行。有关任何应用均可使用的触发器类型的列表,请参阅 SystemTriggerMaintenanceTrigger

以下示例向你展示如何编写使用 Windows.UI.WebUI.WebUIBackgroundTaskInstance 的后台任务 Worker。在开始之前,请在 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. 后台任务应该可以识别何时要求它停止工作。首先,添加用于“已取消”事件的事件侦听器,并添加名为“已取消”的变量来为后台任务提供信号。

    后台任务示例将通过 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();
        }
    
    })();
    
  3. 确保你的后台任务在每次完成工作或已取消时都会调用内置 close() 方法。如果后台任务不自己关闭,则后台任务的进程可以继续存在,从而消耗内存和电池使用时间,即使该后台任务已完成。

    每当 JavaScript 后踢任务完成工作或取消时,调用 close():

    
    close();
    

以下步骤涉及向你的现有应用(例如“default.js”)添加代码。

注意  你还可以创建专用于注册后台任务的函数 - 请参阅如何注册后台任务。在这种情况下,不使用接下来的 3 个步骤,你可以简单构造触发器并将其随任务名称、任务入口点以及(可选)条件一起提供给注册函数。

 

注册后台任务

  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 应用在你发布更新后继续正常运行,你必须在启动已经过更新的应用时调用 RemoveAccess,然后调用 RequestAccessAsync。有关详细信息,请参阅后台任务指南 (HTML)

处理后台任务完成

你的应用可以通过在每次应用激活时注册“completed”事件侦听器观察进度和后台任务的完成情况。

  1. 编写函数,以便你的应用可以使用该函数识别后台 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");
            }
        };
    }
    
  2. 订阅具有该函数的“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 引用

Windows.ApplicationModel.Background