从后台任务访问传感器和设备

DeviceUseTrigger 允许通用 Windows 应用在后台访问传感器和外围设备,即使前台应用暂停也是如此。 例如,根据应用正在运行的位置,它可以使用后台任务将数据与设备或监视传感器同步。 为了帮助延长电池寿命并确保获得适当的用户同意,DeviceUseTrigger 的使用需要遵守本主题中描述的策略。

若要访问后台的传感器或外围设备,请创建使用 DeviceUseTrigger的后台任务。 有关演示如何在电脑上执行此操作的示例,请参阅 自定义 USB 设备示例。 有关手机上的示例,请参阅 后台传感器示例

重要

DeviceUseTrigger 不能与进程内后台任务一起使用。 本主题中的信息仅适用于进程外运行的后台任务。

设备后台任务概述

当用户不再看到你的应用时,Windows 将暂停或终止你的应用以回收内存和 CPU 资源。 这样,其他应用就可以在前台运行并减少电池消耗。 发生这种情况时,如果没有后台任务的帮助,任何正在进行的数据事件都将丢失。 Windows 提供后台任务触发器(DeviceUseTrigger)让应用在后台安全地对设备和传感器执行长时间运行的同步和监视操作,即使应用已暂停也是如此。 有关应用生命周期的详细信息,请参阅 启动、恢复和后台任务。 有关后台任务的详细信息,请参阅 通过后台任务支持您的应用

注意 在通用 Windows 应用中,要在后台同步设备,必须获得用户对应用后台同步的批准。 设备还必须连接到电脑或与电脑配对,并确保 I/O 活动有效,同时允许最多 10 分钟的后台活动。 本主题稍后将介绍有关策略强制执行的更多详细信息。

限制:关键设备操作

某些关键设备操作(如长时间运行的固件更新)不能与 DeviceUseTrigger一起执行。 此类操作只能在电脑上执行,并且只能由使用 DeviceServicingTrigger的特权应用执行。 特权应用 是设备制造商授权执行这些操作的应用。 设备元数据用于指定哪些应用(如果有)已指定为设备的特权应用。 有关详细信息,请参阅 Microsoft Store 的设备应用程序的同步与更新。

DeviceUseTrigger 后台任务支持的协议/API

使用 DeviceUseTrigger 的后台任务 让应用通过许多协议/API 进行通信,其中大多数协议/API 不受系统触发的后台任务支持。 通用 Windows 应用支持以下各项。

协议 通用 Windows 应用中的 DeviceUseTrigger
USB 支持此协议 。
隐藏 支持此协议 。
蓝牙 RFCOMM 支持此协议 。
蓝牙 GATT 支持此协议 。
移动运输协议 (MTP) 支持此协议 。
网络有线 支持此协议 。
网络 Wi-Fi 支持此协议 。
IDeviceIOControl deviceservicingtrigger 支持 ideviceiocontrol
传感器 API deviceservicingtrigger 支持通用传感器 API (仅限于 通用设备系列中的传感器)

在应用包清单中注册后台任务

你的应用将在作为后台任务的一部分运行的代码中执行同步和更新操作。 此代码嵌入在 Windows 运行时类库中,该类库实现 IBackgroundTask(或者在适用于 JavaScript 应用的专用 JavaScript 页面中)。 若要使用 DeviceUseTrigger 后台任务,您的应用必须在前台应用程序的应用清单文件中声明它,就像对于系统触发的后台任务一样。

在这个应用包清单文件中,DeviceLibrary.SyncContent 是一个后台任务的入口点,该任务使用 DeviceUseTrigger

<Extensions>
  <Extension Category="windows.backgroundTasks" EntryPoint="DeviceLibrary.SyncContent">
    <BackgroundTasks>
      <m2:Task Type="deviceUse" />
    </BackgroundTasks>
  </Extension>
</Extensions>

使用 DeviceUseTrigger 介绍

若要使用 DeviceUseTrigger,请执行以下步骤。 使用后台任务支持您的应用,详细信息请参阅

  1. 你的应用在应用清单中注册其后台任务,并将后台任务代码嵌入到实现 IBackgroundTask 的 Windows 运行时类或 JavaScript 应用的专用 JavaScript 页面中。
  2. 应用启动时,它将创建并配置 DeviceUseTrigger类型的触发器对象,并存储触发器实例以供将来使用。
  3. 应用会检查后台任务是否已注册,如果尚未注册,则针对触发器注册该任务。 请注意,不允许应用针对与此触发器关联的任务设置条件。
  4. 当应用需要触发后台任务时,它必须首先调用 RequestAccessAsync 来检查应用是否能够请求后台任务。
  5. 如果应用可以请求后台任务,它会在设备触发器对象上调用 RequestAsync 激活方法。
  6. 您的后台任务与其他系统后台任务不同,它没有 CPU 时间配额限制。但它会以降低优先级运行,以保持前台应用的响应性。
  7. 然后,Windows 将根据触发器类型验证是否满足必要的策略,包括请求用户同意操作,然后再启动后台任务。
  8. Windows 监视系统条件和任务运行时,如有必要,如果不再需要满足所需条件,则取消任务。
  9. 当后台任务报告进度或完成时,您的应用将通过注册任务的进度事件和完成事件接收这些信息。

使用 DeviceUseTrigger时,重要 考虑以下要点:

  • 在 Windows 8.1 和 Windows Phone 8.1 中首次引入了能够以编程方式触发使用 DeviceUseTrigger 的后台任务的功能。

  • 某些策略由 Windows 强制实施,以确保在电脑上更新外围设备时用户同意。

  • 在同步和更新外围设备时,将强制实施其他策略,以保留用户的电池使用时间。

  • 当某些策略要求不再满足时,Windows 可能会取消使用 DeviceUseTrigger 的后台任务,其中包括最大后台运行时间的限制(以时钟时间计)。 使用这些后台任务与外围设备交互时,请务必考虑这些策略要求。

提示 若要查看这些后台任务的工作原理,请下载示例。 有关演示如何在电脑上执行此操作的示例,请参阅 自定义 USB 设备示例。 有关手机上的示例,请参阅 后台传感器示例。  

频率和前台限制

应用可以启动操作的频率没有限制,但应用一次只能运行一个 DeviceUseTrigger 后台任务操作(这不会影响其他类型的后台任务),并且只能在应用处于前台时启动后台任务。 当应用不在前台时,无法使用 DeviceUseTrigger启动后台任务。 在完成第一个后台任务之前,你的应用无法启动第二个 DeviceUseTrigger 后台任务。

设备限制

虽然每个应用只能注册并运行一个 DeviceUseTrigger 后台任务,但设备(正在运行应用)可能允许多个应用注册并运行 DeviceUseTrigger 后台任务。 根据设备,可能限制来自所有应用的 DeviceUseTrigger 后台任务总数。 这有助于在资源受限的设备上保留电池。 有关更多详细信息,请参阅下表。

从单个 DeviceUseTrigger 后台任务中,应用可以访问无限数量的外围设备或传感器 - 仅受上表中所列支持的 API 和协议的限制。

后台任务策略

当应用使用 DeviceUseTrigger 后台任务时,Windows 会强制实施策略。 如果未能满足这些策略,后台任务可能会被取消。 使用此类型的后台任务与设备或传感器交互时,请务必考虑这些策略要求。

任务启动策略

此表指示哪些任务启动策略适用于通用 Windows 应用。

政策 通用 Windows 应用中的 DeviceUseTrigger
触发后台任务时,应用位于前台。 政策适用
设备连接到系统(或在无线连接范围内)。 政策适用
可以使用受支持的设备外围 API(USB、HID、蓝牙、传感器等的 Windows 运行时 API)访问应用。 如果应用无法访问设备或传感器,则拒绝访问后台任务。 政策适用
应用程序提供的后台任务入口点已在应用程序包清单中注册。 政策适用
每个应用仅运行一个 DeviceUseTrigger 后台任务。 政策适用
设备(您的应用正在运行的设备)上的 DeviceUseTrigger 后台任务的最大数目尚未达到。 桌面设备系列:可以并行注册和运行无限数量的任务。 移动设备系列:在 512 MB 设备上,只能运行 1 个任务;在其他设备上,可以注册并并行运行 2 个任务。
使用支持的 API/协议时,您的应用通过单个 DeviceUseTrigger 后台任务能够访问的最大外围设备或传感器数量。 无限
当屏幕锁定时,后台任务每分钟消耗 400 毫秒的 CPU 时间(假设为 1GHz CPU),或者在屏幕未锁定时每 5 分钟使用一次。 未能满足此策略可能会导致任务取消。 政策适用

运行时策略检查

Windows 在后台运行任务时强制执行以下运行时策略要求。 如果任何运行时要求不再满足条件,Windows 将取消设备的后台任务。

此表指示哪些运行时策略适用于通用 Windows 应用。

政策检查 通用 Windows 应用中的 DeviceUseTrigger
设备连接到系统(或在无线连接范围内)。 策略检查适用于
任务正在对设备执行常规 I/O(每 5 秒 1 个 I/O)。 策略检查适用于
应用尚未取消任务。 策略检查适用于
墙上时钟时间限制 – 应用任务可以在后台运行的总时长。 桌面设备系列:10 分钟。 移动设备系列:无时间限制。 若要节省资源,一次最多可以执行 1 个或 2 个任务。
应用尚未退出。 策略检查适用于

最佳做法

使用 DeviceUseTrigger 后台任务的应用程序的最佳实践如下。

对后台任务进行编程

使用应用中的 DeviceUseTrigger 后台任务,确保从前台应用程序启动的任何同步或监视操作在用户切换应用时,能够在前台应用程序被 Windows 挂起后继续在后台运行。 建议按照以下总体模型来注册、触发和取消注册后台任务:

  1. 调用 RequestAccessAsync 以检查应用是否能够请求后台任务。 必须在注册后台任务之前完成此操作。

  2. 在请求触发器之前,先注册后台任务。

  3. 将进度和完成事件处理程序连接到触发器。 当您的应用从挂起状态返回时,Windows 将为您的应用提供所有可用于确定后台任务状态的排队进度事件或完成事件。

  4. 在触发 DeviceUseTrigger 后台任务时,请关闭所有已打开的设备或传感器对象,以便这些设备或传感器可以由您的后台任务自由打开和使用。

  5. 注册触发器。

  6. 仔细考虑从后台任务访问设备或传感器对电池的影响。 例如,如果传感器运行的报告间隔太频繁,可能会导致任务经常运行,从而快速耗尽手机的电池。

  7. 后台任务完成后,请注销它。

  8. 请从后台任务类中注册取消事件。 注册取消事件将允许后台任务代码在 Windows 或前台应用取消时彻底停止正在运行的后台任务。

  9. 当应用退出(而非挂起)时,如果应用不再需要,请取消注册并终止所有正在运行的任务。 在资源受限的系统(如低内存手机)上,这将允许其他应用使用 DeviceUseTrigger 后台任务。

    • 应用退出时,注销并取消任何正在运行的任务。

    • 应用退出后,将取消后台任务,并且任何现有事件处理程序都将与现有后台任务断开连接。 这防止你确定后台任务的状态。 取消注册和取消后台任务将允许取消代码彻底停止后台任务。

取消后台任务

若要从前台应用取消在后台运行的任务,请使用在应用中使用的 BackgroundTaskRegistration 对象上的 Unregister 方法注册 DeviceUseTrigger 后台任务。 在 BackgroundTaskRegistration 上使用 Unregister 方法注销后台任务将导致后台任务基础结构取消其任务。

Unregister 方法还采用布尔值 true 或 false,以指示当前正在运行的后台任务的实例是否应取消,而不允许它们完成。 有关详细信息,请参阅 注销的 API 参考文档。

除了 注销,你的应用还需要调用 BackgroundTaskDeferral.Complete。 这会通知系统与后台任务关联的异步操作已完成。