Windows 8.1 中应用商店设备应用的设备同步和更新

在 Windows 8.1 中,UWP 应用可以使用设备后台任务来同步外围设备上的数据。 如果应用与设备元数据相关联,则该 UWP 设备应用还可以使用设备后台代理进行设备更新,例如固件更新。 设备后台代理需遵守相关策略,以确保用户同意,并在设备同步和更新时帮助保持电池寿命。

要执行设备同步和更新操作,请分别创建使用 DeviceUseTriggerDeviceServicingTrigger 的设备后台任务。 要了解如何使用自定义 USB 设备示例完成此操作,请参阅创建设备后台任务

注意

Windows 运行时设备 API 不需要设备元数据。 这意味着你的应用不需要是 UWP 设备应用即可使用它们。 UWP 应用可以使用这些 API 访问 USB、人机接口设备 (HID)、蓝牙设备等。 有关详细信息,请参阅集成设备

设备后台任务概述

当用户在屏幕外移动 UWP 应用时,Windows 会将应用挂起到内存中。 这样,另一个应用就可以拥有前台。 当应用挂起时,它驻留在内存中,Windows 已阻止它运行。 发生这种情况时,如果没有设备后台任务的帮助,任何正在进行的设备操作(如同步和更新)都会中断。 Windows 8.1 提供了两个新的后台任务触发器,可让你的应用在后台安全地对外围设备执行长时间的同步和更新操作,即使你的应用处于挂起状态:DeviceUseTrigger 和 DeviceServicingTrigger。 有关应用挂起的详细信息,请参阅启动、恢复和多任务

后台任务触发器 需要设备元数据 说明
DeviceUseTrigger 在应用挂起时,可与外围设备进行长时间同步操作。 要在后台同步设备,用户必须批准应用进行后台同步。 设备还必须与电脑连接或配对,具有活动的 I/O,且最多允许 10 分钟的后台活动。 本主题稍后将介绍有关策略强制实施的更多详细信息。
DeviceServicingTrigger 当应用挂起时,可进行长时间的设备更新,例如设置传输或固件更新。 每次使用后台任务更新设备时,都需要用户批准。 与 DeviceUseTrigger 后台任务不同,DeviceServicingTrigger 后台任务允许设备重新启动和断开连接,并允许最长 30 分钟的后台活动。 本主题稍后将介绍有关策略强制实施的更多详细信息。

DeviceServicingTrigger 需要设备元数据,因为应用必须指定为特权应用才能执行设备更新操作。

应用特权

某些关键设备操作(如长时间运行的设备更新)只能由特权应用执行。 特权应用是设备制造商授权执行这些操作的应用。 设备元数据指定哪个应用(如果有)被指定为设备的特权应用。

使用设备元数据向导创建设备元数据时,请在指定 UWP 设备应用信息页上指定应用。 有关详细信息,请参阅步骤 2:为 UWP 设备应用创建设备元数据

支持的协议

使用 DeviceUseTrigger 和 DeviceServicingTrigger 的设备后台任务让你的应用可以通过 UWP 应用通常使用的系统触发任务不支持的协议与外围设备通信。

协议 DeviceServicingTrigger DeviceUseTrigger 系统触发器
USB deviceservicingtrigger supports usb. deviceusetrigger supports usb system triggers do not support usb
HID deviceservicingtrigger supports hid. deviceusetrigger supports hid system triggers do not support hid
蓝牙 RFCOMM deviceservicingtrigger supports bluetooth rfcomm. deviceusetrigger supports bluetooth rfcomm system triggers do not support bluetooth rfcomm
蓝牙 GATT deviceservicingtrigger supports bluetooth gatt. deviceusetrigger supports bluetooth gatt system triggers do not support bluetooth gatt
MTP deviceservicingtrigger supports mtp. deviceusetrigger does not support mtp system triggers do not support mtp
有线网络 deviceservicingtrigger supports network wired. deviceusetrigger does not support network wired system triggers do not support network wired
网络和 Wi-Fi deviceservicingtrigger supports networked wi-fi. deviceusetrigger does not support networked wi-fi system triggers do not support network wi-fi
IDeviceIOControl deviceservicingtrigger supports ideviceiocontrol. deviceusetrigger does not support ideviceiocontrol system triggers do not support ideviceiocontrol

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

你的应用将在作为后台任务的一部分运行的代码中执行同步和更新操作。 此代码嵌入嵌入到一个实现 IBackgroundTask 的 Windows 运行时类中(或嵌入到 JavaScript 应用的专用 JavaScript 页面中)。 要使用设备后台任务,你的应用必须在前台应用的应用清单文件中声明,就像系统触发的后台任务一样。

在此应用包清单文件示例中,DeviceLibrary.SyncContentDeviceLibrary.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 后台任务,请遵循以下一组基本步骤。 有关后台任务的详细信息,请参阅使用后台任务支持应用

  1. 你的应用会在应用清单中注册其后台任务,并将后台任务代码嵌入到实现 IBackgroundTask 的 Windows 运行时类中,或嵌入到 JavaScript 应用的专用 JavaScript 页面中。

  2. 应用启动时,它将创建并配置相应类型的设备触发器对象(DeviceUseTrigger 或 DeviceServicingTrigger)并存储触发器实例以供将来使用。

  3. 应用会检查是否已注册后台任务,如果尚未注册,则会根据设备触发器进行注册。 请注意,不允许应用针对与此触发器关联的任务设置条件。

  4. 当你的应用需要触发后台任务时,它会在设备触发器对象上调用 RequestAsync 激活方法。

  5. 你的后台任务不会像其他系统后台任务一样受到限制(没有 CPU 时间配额),但会以降低优先级运行,以保持前台应用程序的响应速度。

  6. 然后,Windows 将根据触发器类型验证是否满足必要的策略要求,包括在启动后台任务前征求用户对操作的同意。

  7. Windows 监视系统条件和任务运行时,如有必要,会在不再满足所需条件时取消任务。

  8. 当后台任务报告进度或完成时,应用将通过已注册任务的进度和已完成事件接收这些事件。

使用设备后台任务时要注意的重要事项

  • Windows 8.1 中引入了以编程方式触发使用 DeviceUseTrigger 和 DeviceServicingTrigger 的后台任务的功能,该功能仅限于设备后台任务。

  • 在更新外围设备时,Windows 会强制实施某些策略,以确保用户同意。 在同步和更新外围设备时,还会强制实施其他相关策略,以保护用户的电池寿命。

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

提示

要查看这些后台任务的工作原理,请下载示例。 自定义 USB 设备示例演示了一个使用 DeviceUseTrigger 执行设备同步的后台任务。

使用 DeviceUseTrigger 或 DeviceServicingTrigger 时,Windows 8.1 会强制实施相关策略,以确保用户已向你的应用授予在后台访问其设备以同步和更新内容的权限。 在同步和更新外围设备时,还会强制实施相关策略,帮助保护用户的电池寿命。

使用 DeviceUseTrigger 的后台任务需要一次性用户同意,允许你的应用在后台同步。 此同意按应用和设备型号存储。 用户同意让应用在后台访问设备,就像他们同意在应用处于前台时允许应用访问设备一样。

在以下示例中,名为 Tailspin Toys 的应用正在获得用户在后台同步的权限。

device sync user consent message dialog.

如果用户以后改变了想法,他们可以在“设置”中撤销权限。

device sync permissions setting dialog.

与使用 DeviceUseTrigger 不同的是,使用 DeviceServicingTrigger 的后台任务在每次触发时都需要用户同意。 而且此同意不会像 DeviceUseTrigger 那样进行存储。 这是因为设备固件更新所涉及的操作风险较高,而且设备更新所需的时间较长。 除了获得用户同意外,Windows 还将向用户提供有关设备更新的信息,例如在整个更新过程中保持设备连接并确保电脑有电的警告,以及操作的大致运行时间(如果你的应用程序提供)。

device update user consent message dialog.

频率和前台限制

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

设备后台任务策略

当你的应用使用设备后台任务时,Windows 会强制实施相关策略。 如果未满足这些策略,则可能会取消使用 DeviceUseTrigger 或 DeviceServicingTrigger 的后台任务。 使用设备后台任务与外围设备交互时,请务必考虑这些策略要求。

任务启动策略

本表说明了哪些任务启动策略适用于每个后台任务触发器。

策略 DeviceServicingTrigger DeviceUseTrigger
触发后台任务时,你的 UWP 应用位于前台。 policy applies. policy applies
你的设备已连接到系统(或处于无线设备的范围内)。 policy applies. policy applies
当屏幕锁定时,你的后台任务每分钟消耗 400 毫秒的 CPU 时间(假设 CPU 频率为 1GHz);当屏幕未锁定时,每 5 分钟消耗 400 毫秒的 CPU 时间。 未能满足此策略可能会导致任务取消。 policy applies. policy applies
应用可使用设备外围设备 API(用于 USB、HID、蓝牙等的 Windows 运行时 API)访问你的设备。 如果你的应用无法访问设备,则拒绝访问后台任务。 policy applies. policy applies
应用提供的后台任务入口点在应用包清单中注册。 policy applies. policy applies
用户已向任务授予继续的权限。 每次。 第一次,然后由应用权限控制。
应用提供的时间估计小于 30 分钟。 policy applies. policy does not apply
应用被指定为设备的特权应用。 (必须与设备容器的设备元数据中的特权应用程序列表中的应用 ID 完全匹配)。 policy applies. policy does not apply
计算机剩余的电池容量超过 33% 或使用交流电源。 policy applies. policy does not apply
每个操作类型只运行一个设备后台任务。 policy check applies. policy applies

运行时策略检查

任务在后台运行时,Windows 会强制执行以下运行时策略要求。 如果运行时要求中的任何一项不再为 true,Windows 将取消设备后台任务。

本表说明了哪些运行时策略适用于每个后台任务触发器。

策略检查 DeviceServicingTrigger DeviceUseTrigger
时钟时间限制 – 应用任务可以在后台运行的总时间。 30 分钟 10 分钟
你的设备已连接到系统(或处于无线设备的范围内)。 policy does not apply. policy check applies
任务正在对设备执行常规 I/O(每 5 秒 1 次 I/O)。 policy does not apply. policy check applies
应用尚未取消任务。 policy check applies. policy check applies
应用尚未退出。 policy check applies. policy check applies

最佳实践

下面是使用设备后台任务的 UWP 设备应用的最佳做法。

设备后台任务编程模型

使用应用中的 DeviceUseTrigger 或 DeviceServicingTrigger 后台任务,可确保从前台应用启动的任何同步或设备更新操作在后台继续运行,前提是用户切换应用和前台应用被 Windows 挂起。 建议遵循此总体模型来注册、触发和取消注册后台任务:

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

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

  3. 触发 DeviceUseTrigger 或 DeviceServicingTrigger 后台任务时关闭任何打开的设备对象,以便后台任务可以自由打开和使用这些设备。

  4. 注册触发器。

  5. 任务完成后,取消注册后台任务。 完成后台任务时,可以取消注册后台任务,然后重新打开设备并通过 UWP 应用程序定期使用设备。

  6. 从后台任务类注册取消事件。 注册取消事件可让你的后台任务代码在被 Windows 或前台应用程序取消时彻底停止正在运行的后台任务。

  7. 在应用退出(未挂起)时,取消注册并取消任何正在运行的任务。

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

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

提示

有关如何使用自定义 USB 设备示例完成此操作的详细说明,请参阅创建设备后台任务

取消后台任务

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

此外,Unregister 方法还会获取一个布尔值 true 或 false,以指示是否应取消当前运行的后台任务实例,而不允许其结束。 有关详细信息,请参阅 BackgroundTaskRegistration.Unregister 的 API 参考。

创建设备后台任务

自定义 USB 设备示例

Launching, resuming, and multitasking

使用后台任务支持应用