从应用内触发后台任务

了解如何使用 ApplicationTrigger 从应用中激活后台任务。

有关如何创建应用程序触发器的示例,请参阅 此示例

本主题假定你有一个要从应用程序激活的后台任务。 如果您尚未有后台任务,可以在 BackgroundActivity.cs找到一个示例后台任务。 或者,按照 中创建和注册进程外后台任务 的步骤来创建一个。

为何使用应用程序触发器

使用 ApplicationTrigger 在与前台应用不同的进程中运行代码。 如果你的应用具有需要在后台完成的工作,即使用户关闭前台应用, ApplicationTrigger 也适用。 如果后台工作应在应用关闭时停止,或者应与前台进程的状态关联,则应改用 扩展执行

创建应用程序触发器

创建新的 ApplicationTrigger 。 您可以像下面代码片段所做的一样将其存储在字段中。 这是为了方便起见,因此,我们以后在想要向触发器发出信号时不必创建新实例。 但可以使用任何 ApplicationTrigger 实例来向触发器发出信号。

// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
_AppTrigger = new ApplicationTrigger();
// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
Windows::ApplicationModel::Background::ApplicationTrigger _AppTrigger;
// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
ApplicationTrigger ^ _AppTrigger = ref new ApplicationTrigger();

(可选)添加条件

可以创建后台任务条件来控制任务何时运行。 条件可防止后台任务在满足条件之前运行。 有关详细信息,请参阅 设置运行后台任务的条件

在此示例中,条件设置为 InternetAvailable ,以便触发后,任务仅在 Internet 访问可用后运行。 有关可能条件的列表,请参阅 SystemConditionType

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

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

调用 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() 方法的定义,请参阅 注册后台任务

如果考虑使用应用程序触发器来延长前台进程的生存期,请考虑改用 扩展执行。 应用程序触发器旨在创建单独托管的进程以执行工作。 以下代码片段注册一个外部后台触发器。

string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName   = "Example application trigger";

BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example application trigger" };

Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
    RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName   = "Example application trigger";

BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition);

后台任务注册参数在注册时会被验证。 如果任何注册参数无效,则返回错误。 确保应用程序能够有效处理后台任务注册失败的情况——如果在尝试注册任务后应用程序依赖于拥有有效的注册对象,那么它可能会崩溃。

触发后台任务

在触发后台任务之前,请使用 BackgroundTaskRegistration 验证是否已注册后台任务。 在应用启动时验证所有后台任务是否已注册是一个好时机。

通过调用 ApplicationTrigger.RequestAsync 来触发后台任务。 ApplicationTrigger 实例的任何 都将执行。

请注意,无法从后台任务本身或应用处于后台运行状态时调用 ApplicationTrigger.RequestAsync (有关应用程序状态的详细信息 ,请参阅应用生命周期 )。 如果用户设置了阻止应用执行后台活动的能源或隐私策略,则它可能会返回 DisabledByPolicy 。 此外,一次只能运行一个 AppTrigger。 如果您尝试在另一个 AppTrigger 已正在运行的情况下运行该功能,该功能将返回 CurrentlyRunning

var result = await _AppTrigger.RequestAsync();

管理您后台任务的资源

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

  • 内存:优化应用的内存和能量使用是确保操作系统允许后台任务运行的关键。 使用 内存管理 API 查看后台任务使用的内存量。 后台任务使用的内存越多,当另一个应用处于前台时,OS 就越难保持其运行。 用户最终可以控制应用可以执行的所有后台活动,并能够查看应用对电池使用的影响。
  • CPU 时间:后台任务的时钟使用时间受到触发器类型的限制。 应用程序触发器触发的后台任务限制为大约 10 分钟。

有关应用于后台任务的资源约束,请参阅 使用后台任务支持您的应用

注解

从 Windows 10 开始,用户不再需要将应用添加到锁屏,以便利用后台任务。

如果首先调用 RequestAccessAsync,则后台任务将仅使用 ApplicationTrigger 运行。