在计时器上运行后台任务

了解如何使用 TimeTrigger 计划一次性后台任务或运行定期后台任务。

请参阅后台激活示例中的方案 4,查看如何实现本主题中介绍的时间触发后台任务。

本主题假定你有需要定期运行或在某一特定时间运行的后台任务。 如果你还没有后台任务,BackgroundActivity.cs 中有一个示例后台任务。 或者也可以按照创建和注册进程内后台任务创建和注册进程外后台任务中的步骤创建一个。

创建时间触发器

创建新的 TimeTrigger。 第二个参数 OneShot 指定后台任务是仅运行一次还是保持周期性运行。 如果 OneShot 设置为 true,则第一个参数 (FreshnessTime) 会指定在计划后台任务之前需等待的分钟数。 如果 OneShot 设置为 false,FreshnessTime 会指定后台任务的运行频率。

面向桌面或移动设备系列的通用 Windows 平台 (UWP) 应用的内置计时器以 15 分钟的间隔运行后台任务。 (计时器以 15 分钟的间隔运行,因此系统只需每 15 分钟唤醒一次来唤醒具有已请求 TimerTriggers 的应用,这可以省电。)

  • 如果 FreshnessTime 设置为 15 分钟并且 OneShot 为 true,则任务将计划从其注册之时起 15 至 30 分钟内运行一次该任务。 如果设置为 25 分钟并且 OneShot 为 true,则任务将计划从其注册之时起 25 至 40 分钟内运行一次该任务。

  • 如果 FreshnessTime 设置为 15 分钟并且 OneShot 为 false,则任务将计划从其注册之时起 15 至 30 分钟内每隔 15 分钟运行一次该任务。 如果设置为 n 分钟并且 OneShot 为 false,则任务将计划从其注册之时起 n 至 n + 15 分钟内每隔 n 分钟运行一次该任务。

注意

如果 FreshnessTime 设置为少于 15 分钟,则在尝试注册后台任务时将引发异常。

例如,该触发器将导致后台任务每小时运行一次。

TimeTrigger hourlyTrigger = new TimeTrigger(60, false);
Windows::ApplicationModel::Background::TimeTrigger hourlyTrigger{ 60, false };
TimeTrigger ^ hourlyTrigger = ref new TimeTrigger(60, false);

(可选)添加条件

你可以创建一个后台任务条件以控制任务何时运行。 条件会阻止后台任务运行,直到条件满足为止。 有关详细信息,请参阅设置后台任务的运行条件

在此示例中,条件设置为 UserPresent,以便在触发之后,在用户处于活动状态时才运行一次该任务。 有关可能条件的列表,请参阅 SystemConditionType

SystemCondition userCondition = new SystemCondition(SystemConditionType.UserPresent);
Windows::ApplicationModel::Background::SystemCondition userCondition{
    Windows::ApplicationModel::Background::SystemConditionType::UserPresent };
SystemCondition ^ userCondition = ref new SystemCondition(SystemConditionType::UserPresent);

有关条件和后台触发器类型的更多深入信息,请参阅使用后台任务支持应用

调用 RequestAccessAsync()

注册 ApplicationTrigger 后台任务前,应调用 RequestAccessAsync 以确定用户允许的后台活动级别,因为用户可能为你的应用禁用了后台活动。 有关用户可用来控制后台活动设置的方法的详细信息,请参阅优化后台活动

var requestStatus = await Windows.ApplicationModel.Background.BackgroundExecutionManager.RequestAccessAsync();
if (requestStatus != BackgroundAccessStatus.AlwaysAllowed)
{
    // Depending on the value of requestStatus, provide an appropriate response
    // such as notifying the user which functionality won't work as expected
}

注册后台任务

通过调用后台任务注册函数注册后台任务。 有关注册后台任务的详细信息以及下面示例代码中的 RegisterBackgroundTask() 方法定义,请参阅注册后台任务

重要

对于与你的应用在同一进程中运行的后台任务,请勿设置 entryPoint。 对于在与应用分开的单独进程中运行的后台任务,将 entryPoint 设置为命名空间 '.' 和包含后台任务实现的类名称。

string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName   = "Example hourly background task";

BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example hourly background task" };

Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
    RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName   = "Example hourly background task";

BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);

后台任务注册参数在注册时验证。 如果有任何注册参数无效,则会返回一个错误。 确保你的应用能够流畅地处理后台任务注册失败的情况,否则,如果你的应用依赖于在尝试注册任务后具备有效注册对象,则它可能会崩溃。

管理后台任务的资源

使用 BackgroundExecutionManager.RequestAccessAsync 确定用户是否已决定应限制你应用的后台活动。 注意电池使用情况,并且仅当有必要完成用户想要执行的操作时再在后台运行应用。 有关用户可用来控制后台活动设置的方法的详细信息,请参阅优化后台活动

  • 内存:调整应用内存和能耗使用情况是确保操作系统允许后台任务运行的关键。 使用内存管理 API 查看你的后台任务所使用的内存大小。 当有其他应用在前台运行时,你的后台任务所使用的内存越多,操作系统就越难保持其运行。 用户最终控制你的应用可以执行的所有后台活动,并且可以看到你的应用对电池使用情况的影响。
  • CPU 时间:后台任务受其基于触发器类型获取的时钟时间使用的限制。

有关适用于后台任务的资源限制,请参阅使用后台任务支持应用

注解

从 Windows 10 开始,用户无需再将其应用添加到锁屏界面即可利用后台任务。

如果你先调用 RequestAccessAsync,后台任务将仅使用 TimeTrigger 运行。