重要
设备元数据已弃用,并将在 Windows 的将来版本中删除。 有关替代功能的信息,请参阅驱动程序包容器元数据。
UWP 应用可以使用设备后台任务来同步外围设备上的数据。 如果应用与设备元数据相关联,则 UWP 设备应用还可以使用设备后台代理执行设备更新,例如固件更新。 设备后台代理受策略的约束,这些策略可确保用户同意并帮助在同步和更新设备时保持电池使用时间。
若要执行设备同步和更新作,请分别创建使用 DeviceUseTrigger 和 DeviceServicingTrigger 的设备后台任务。 若要了解如何使用 自定义 USB 设备示例创建设备后台任务,请参阅 “创建设备后台任务”。
Windows 运行时设备 API 不需要设备元数据。 这意味着你的应用不需要是 UWP 设备应用才能使用它们。 UWP 应用可以使用这些 API 访问 USB、人机接口设备(HID)、蓝牙设备等。 有关详细信息,请参阅 “集成设备”。
设备后台任务概述
当用户将你的 UWP 应用移至屏幕之外时,Windows 系统会在内存中暂停你的应用,让另一个应用成为前台。 当应用暂停时,它驻留在内存中,但 Windows 停止了它运行。
任何正在进行的设备操作(如同步和更新),如果没有设备后台任务的帮助,就会被中断。 Windows 提供了两个后台任务触发器来解决此问题:DeviceUseTrigger 和 DeviceServicingTrigger。 这些触发器允许应用在后台安全地在外围设备上执行长时间运行的同步和更新操作,甚至在应用暂停时也能如此。 有关应用程序挂起的详细信息,请参阅 启动、恢复和多任务。
| 后台任务触发器 | 需要设备元数据 | DESCRIPTION |
|---|---|---|
| DeviceUseTrigger | 否 | 在应用挂起时,可与外围设备进行长时间同步操作。 要在后台同步设备,用户必须批准应用进行后台同步。 设备还必须与电脑连接或配对,具有活动的 I/O,且最多允许 10 分钟的后台活动。 本文稍后将介绍有关策略实施的详细信息。 |
| DeviceServicingTrigger | 是的 | 启用长时间运行的设备更新,例如在应用暂停时进行设置传输或固件更新。 每次使用后台任务更新设备时,都需要用户批准。 与 DeviceUseTrigger 后台任务不同,DeviceServicingTrigger 后台任务允许设备重新启动和断开连接,并允许最多 30 分钟的后台活动。 本文稍后将介绍有关策略实施的详细信息。 |
DeviceServicingTrigger 需要设备元数据,因为应用必须指定为特权应用才能执行设备更新作。
应用权限
特权应用可以执行某些关键设备操作,例如需要长时间运行的设备更新。 特权应用是设备制造商授权执行这些作的应用。 设备元数据指定将哪个应用指定为设备的特权应用(如果有)。
使用设备元数据向导创建设备元数据时,请在 “指定 UWP 设备应用信息 ”页上指定应用。 有关详细信息,请参阅 步骤 2:为 UWP 设备应用创建设备元数据。
支持的协议
使用 DeviceUseTrigger 和 DeviceServicingTrigger 的设备后台任务允许应用通过特定协议与外围设备通信。 UWP 应用通常使用的系统触发的任务不支持这些协议。
| 协议 | DeviceServicingTrigger | DeviceUseTrigger | 系统触发器 |
|---|---|---|---|
| USB |
|
|
|
| HID | ** 设备服务触发器支持HID。 |
|
|
| 蓝牙 RFCOMM |
|
|
|
| 蓝牙 GATT |
|
|
|
| MTP |
|
|
|
| 有线网络 |
|
|
|
| 网络和 Wi-Fi |
|
|
|
| IDeviceIOControl |
|
|
|
在应用包清单中注册后台任务
应用程序在作为后台任务运行的代码中执行同步和更新操作。 此代码嵌入在实现 IBackgroundTask 的 Windows 运行时类中(或在 JavaScript 应用的专用 JavaScript 页面中)。 若要使用设备后台任务,应用必须在前台应用的应用清单文件中声明它,就像对系统触发的后台任务一样。
在此应用包清单文件中, DeviceLibrary.SyncContent 和 DeviceLibrary.UpdateFirmware 是前台应用的入口点。 DeviceLibrary.SyncContent 是使用 DeviceUseTrigger 的后台任务的入口点。 DeviceLibrary.UpdateFirmware 是使用 DeviceServicingTrigger 的后台任务的入口点。
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="DeviceLibrary.SyncContent">
<BackgroundTasks>
<m2:Task Type="deviceUse" />
</BackgroundTasks>
</Extension>
<Extension Category="windows.backgroundTasks" EntryPoint="DeviceLibrary.UpdateFirmware">
<BackgroundTasks>
<m2:Task Type="deviceServicing" />
</BackgroundTasks>
</Extension>
</Extensions>
通过设备后台任务使用设备
若要开发应用以利用 DeviceUseTrigger 和 DeviceServicingTrigger 后台任务,请遵循以下基本步骤集。 有关后台任务的详细信息,请参阅 使用后台任务支持应用。
你的应用在应用清单中注册其后台任务,并将后台任务代码嵌入到实现 IBackgroundTask 的 Windows 运行时类或 JavaScript 应用的专用 JavaScript 页面中。
应用启动时,它将创建并配置相应类型的设备触发器对象(DeviceUseTrigger 或 DeviceServicingTrigger)并存储触发器实例以供将来使用。
你的应用会检查后台任务之前是否已注册,如果不是,则针对设备触发器注册该任务。 不允许应用针对与此触发器关联的任务设置条件。
当应用需要触发后台任务时,它会在设备触发器对象上调用 RequestAsync 激活方法。
后台任务不像其他系统后台任务那样受到限制(没有CPU时间配额),但优先级降低以维持前台应用的响应速度。
根据触发器类型,Windows 会验证是否满足必要的策略,包括在启动后台任务之前请求用户同意该作。
Windows 监视系统条件和任务运行时,如有必要,如果不再需要满足所需条件,则取消任务。
当后台任务报告进度或完成时,您的应用将通过注册任务的进度事件和已完成事件来接收这些事件。
使用设备后台任务时要考虑的要点
以编程方式触发使用 DeviceUseTrigger 和 DeviceServicingTrigger 的后台任务的功能仅限于设备后台任务。
Windows 强制实施某些策略,以确保用户在更新其外围设备时获得同意。 在同步和更新外围设备时,会强制实施更多策略来保留用户电池使用时间。
当不再满足某些策略要求(包括最长后台时间(时钟时间))时,Windows 可能会取消使用 DeviceUseTrigger 和 DeviceServicingTrigger 的后台任务。 使用这些后台任务与外围设备交互时,请务必考虑这些策略要求。
小窍门
若要查看这些后台任务的工作原理,请下载示例。 自定义 USB 设备示例演示了一个后台任务,该任务执行与 DeviceUseTrigger 的设备同步。
用户同意
当你的应用使用 DeviceUseTrigger 或 DeviceServicingTrigger 时,Windows 会执行政策,以确保用户授予应用在后台访问设备进行同步和更新内容的权限。 还会强制实施策略,以帮助在同步和更新外围设备时保持用户的电池使用时间。
设备同步用户同意
使用 DeviceUseTrigger 的后台任务需要一次性用户同意,允许应用在后台同步。 此同意按应用和每种设备型号存储。 用户同意让应用在后台访问设备,就像他们同意在应用处于前台时允许应用访问设备一样。
在以下示例中,名为 Tailspin Toys 的应用正在获得用户在后台同步的权限。
如果用户以后改变了想法,他们可以在“设置”中撤销权限。
设备更新用户同意
与使用 DeviceUseTrigger 的后台任务不同,使用 DeviceServicingTrigger 后台任务的后台任务在每次触发后台任务时都需要用户同意。 此同意的存储方式与 DeviceUseTrigger 不同。 这是因为设备固件更新涉及高风险作,需要更多时间才能完成。
Windows 还提供有关设备更新的信息。 这包括在更新过程中保持设备连接并确保电脑充电的警告。 如果您的应用程序提供此功能,Windows 还会显示操作的大致运行时间。
频率和前台限制
应用可以启动作的频率没有限制,但应用一次只能运行一个 DeviceUseTrigger 或 DeviceServicingTrigger 后台任务作(这不会影响其他类型的后台任务),并且只能在应用处于前台时启动后台任务。 当应用不在前台时,无法使用 DeviceUseTrigger 或 DeviceServicingTrigger 启动后台任务。 在完成第一个后台任务之前,你的应用无法启动第二个设备后台任务。
设备后台任务策略
当你的应用使用设备后台任务时,Windows 会强制实施策略。 如果未满足这些策略,则可能会取消使用 DeviceUseTrigger 或 DeviceServicingTrigger 的后台任务。 使用设备后台任务与外围设备交互时,请务必考虑这些策略要求。
任务启动策略
此表指示哪些任务初始策略适用于每个后台任务触发器。
| Policy | DeviceServicingTrigger | DeviceUseTrigger |
|---|---|---|
| 触发后台任务时,UWP 应用位于前台。 |
|
|
| 设备已连接到系统,或者是在无线设备的覆盖范围内。 |
|
|
| 当屏幕锁定时,后台任务每分钟消耗 400 毫秒的 CPU 时间(假设为 1GHz CPU),或者在屏幕未锁定时每 5 分钟使用一次。 未能满足此策略可能会导致任务取消。 |
|
|
| 你的设备可以使用设备外围 API(USB、HID、蓝牙等的 Windows 运行时 API)访问应用。 如果应用无法访问设备,则拒绝访问后台任务。 |
|
|
| 应用程序提供的后台任务入口点已在应用程序包清单中注册。 |
|
|
| 用户已授予任务继续执行的权限。 | 每次。 | 第一次,然后由应用权限控制。 |
| 应用提供的时间估计小于 30 分钟。 |
|
|
| 该应用被指定为设备的特权应用。 (设备容器的设备元数据中必须存在与特权应用列表的完整应用 ID 匹配。 |
|
|
| 计算机剩余的电池容量超过 33% 或使用交流电源。 |
|
|
| 每个操作类型只能运行一个设备后台任务。 |
|
|
运行时策略检查
Windows 在后台运行任务时强制执行以下运行时策略要求。 如果任何运行时要求不再满足条件,Windows 将取消设备的后台任务。
此表指示应用于每个后台任务触发器的运行时策略。
| 策略检查 | DeviceServicingTrigger | DeviceUseTrigger |
|---|---|---|
| 墙钟时间限制 – 应用程序任务在后台运行的总时间。 | 30 分钟 | 10 分钟 |
| 设备已连接到系统,或者是在无线设备的覆盖范围内。 |
|
|
| 任务正在对设备执行常规 I/O(每 5 秒 1 次 I/O)。 |
|
|
| 应用尚未取消任务。 |
|
|
| 应用尚未退出。 |
|
|
最佳做法
下面是使用设备后台任务的 UWP 设备应用的最佳做法。
设备后台任务编程模型
使用应用中的 DeviceUseTrigger 或 DeviceServicingTrigger 后台任务,可确保从前台应用启动的任何同步或设备更新操作在后台继续运行,前提是用户切换应用和前台应用被 Windows 挂起。 建议遵循此总体模型来注册、触发和取消注册后台任务:
在请求触发器之前注册后台任务。
将进度和完成事件处理程序连接到触发器。 当应用恢复运行时,Windows 会向应用提供可用于确定后台任务状态的任何排队进度或完成事件。
触发 DeviceUseTrigger 或 DeviceServicingTrigger 后台任务时关闭任何打开的设备对象,以便后台任务可以自由打开和使用这些设备。
注册触发器。
任务完成后,注销后台任务。 完成后台任务后,可以注销后台任务并重新打开设备,并从 UWP 应用定期使用它。
从后台任务类注册取消事件。 注册取消事件后,后台任务代码可以在 Windows 或前台应用取消时彻底停止正在运行的后台任务。
当应用程序退出而不是挂起时,注销和取消任何正在运行的任务。
应用退出时,注销并取消任何正在运行的任务。
当应用退出时,你的后台任务将被取消,并且任何现有事件处理程序都与现有后台任务断开连接。 这样你就无法确定后台任务的状态。 取消注册和取消后台任务将允许你的取消代码彻底停止后台任务。
小窍门
有关如何使用 自定义 USB 设备示例完成此作的详细说明,请参阅 “创建设备后台任务”。
取消后台任务
若要从前台应用取消在后台运行的任务,请在应用中使用的 BackgroundTaskRegistration 对象上使用 Unregister 方法注册 DeviceUseTrigger 或 DeviceServicingTrigger 后台任务。 使用 BackgroundTaskRegistration 的 Unregister 方法注销后台任务,将导致后台任务框架取消您的后台任务。
Unregister 方法还采用布尔值(true 或 false)用于指示是否应取消当前正在运行的后台任务实例,无需等待其完成。 有关详细信息,请参阅 BackgroundTaskRegistration.Unregister 的 API 参考。