如何注册后台任务 (HTML)
[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]
了解如何创建可以重新使用以安全注册大部分后台任务的函数。 本主题指导完成注册后台任务的实用工具函数。此实用工具函数在注册任务前首先多次检查现有注册以避免多次注册产生的错误,并且该函数可以将系统条件应用于后台任务。本操作实例包括此实用工具函数的正常运行的完整示例。
注意
对于 Windows Phone 应用商店应用,你必须在尝试注册任何任务之前先调用 RequestAccessAsync在 Windows 上,仅需在后台任务要求应用在锁屏上才能运行的情况下进行该调用,但在手机上,你必须在每次注册任何后台任务之前调用该方法。
若要确保 Windows Phone 应用在你发布更新后继续正常运行,你必须在启动已经过更新的应用时调用 RemoveAccess,然后调用 RequestAccessAsync。有关详细信息,请参阅后台任务指南 (HTML)。
你需要了解的内容
技术
先决条件
- 本主题假定你已拥有一个需要注册的后台任务(本主题不介绍如何编写后台任务)。
说明
步骤 1: 定义函数签名
此函数包含任务入口点、任务名称、预构建的后台任务触发器以及后台任务的 SystemCondition(可选)。请注意,此函数将返回 BackgroundTaskRegistration 对象。
function RegisterBackgroundTask(taskEntryPoint,
taskName,
trigger,
condition)
{
// We’ll add code to this function in subsequent steps.
}
步骤 2: 检查现有注册
检查任务是否已注册。请务必检查此项,因为如果任务已多次注册,则将在该任务触发时运行多次,这可占用过多的 CPU 配额并可能导致意外行为。
你可以通过查询 BackgroundTaskRegistration.AllTasks 属性并在结果上迭代来检查现有注册。检查每个实例的名称 – 如果该名称与正注册的任务的名称匹配,则跳出循环并设置标志变量,以便你的代码可以在下一步中选择不同的路径。
注意 使用应用唯一的后台任务名称。确保每个后台任务都具有唯一的名称。
以下代码使用我们在上一步中创建的 SystemTrigger 注册后台任务:
function RegisterBackgroundTask(taskEntryPoint,
taskName,
trigger,
condition)
{
//
// Check for existing registrations of this background task.
//
var taskRegistered = false;
var background = Windows.ApplicationModel.Background;
var iter = background.BackgroundTaskRegistration.allTasks.first();
var hascur = iter.hasCurrent;
while (hascur) {
var cur = iter.current.value;
if (cur.name === taskName) {
taskRegistered = true;
break;
}
hascur = iter.moveNext();
}
// We’ll register the task in the next step.
}
步骤 3: 注册后台任务(或返回现有注册)
检查在现有后台任务注册的列表中是否找到该任务。如果有,则返回该任务的实例。
否则,使用新 BackgroundTaskBuilder 对象注册任务。此代码应检查条件参数是否为空,并且如果不为空,则将条件添加到注册对象。返回 BackgroundTaskBuilder.Register 函数返回的 BackgroundTaskRegistration。
注意
从 Windows 8.1 开始,后台任务注册参数在注册时进行验证。如果任何注册参数无效,则会返回一个错误。你的应用必须能够处理后台任务注册失败的情况,例如,使用条件语句检查注册错误,然后使用其他参数值重试失败的注册。
下例可能返回现有任务,也可能添加注册后台任务的代码(如果有,包含可选系统条件):
function RegisterBackgroundTask(taskEntryPoint,
taskName,
trigger,
condition)
{
//
// Check for existing registrations of this background task.
//
var taskRegistered = false;
var background = Windows.ApplicationModel.Background;
var iter = background.BackgroundTaskRegistration.allTasks.first();
var hascur = iter.hasCurrent;
while (hascur) {
var cur = iter.current.value;
if (cur.name === taskName) {
taskRegistered = true;
break;
}
hascur = iter.moveNext();
}
//
// If the task is already registered, return the registration object.
//
if (taskRegistered == true) {
return iter.current;
}
//
// Register the background task.
//
var builder = new background.BackgroundTaskBuilder();
builder.Name = taskName;
builder.TaskEntryPoint = taskEntryPoint;
builder.setTrigger(trigger);
if (condition != null) {
builder.addCondition(condition);
}
var task = builder.register();
return task;
}
完整的后台任务注册实用工具函数
此示例展示完整的后台任务注册函数。此函数可用于注册大部分后台任务,但不能注册网络后台任务。
//
// Register a background task with the specified taskEntryPoint, name, trigger,
// and condition (optional).
//
// taskEntryPoint: Task entry point for the background task.
// taskName: A name for the background task.
// trigger: The trigger for the background task.
// condition: Optional parameter. A conditional event that must be true for the task to fire.
//
function RegisterBackgroundTask(taskEntryPoint,
taskName,
trigger,
condition)
{
//
// Check for existing registrations of this background task.
//
var taskRegistered = false;
var background = Windows.ApplicationModel.Background;
var iter = background.BackgroundTaskRegistration.allTasks.first();
var hascur = iter.hasCurrent;
while (hascur) {
var cur = iter.current.value;
if (cur.name === taskName) {
taskRegistered = true;
break;
}
hascur = iter.moveNext();
}
//
// If the task is already registered, return the registration object.
//
if (taskRegistered == true) {
return iter.current;
}
//
// Register the background task.
//
var builder = new background.BackgroundTaskBuilder();
builder.Name = taskName;
builder.TaskEntryPoint = taskEntryPoint;
builder.setTrigger(trigger);
if (condition != null) {
builder.addCondition(condition);
}
var task = builder.register();
return task;
}