在 Windows 8.1 中创建设备后台任务(UWP 设备应用)

在 Windows 8.1 中,UWP 应用可以同步外围设备上的数据。 如果你的应用与设备元数据相关联,则该 UWP 设备应用还可以执行设备更新,例如固件更新。 本主题介绍如何创建使用 DeviceUseTriggerDeviceServicingTrigger 的设备后台任务。 使用这些触发器的设备后台代理需遵守相关策略,以确保用户同意,并在设备同步和更新时帮助保持电池寿命。 有关设备后台任务的详细信息,请参阅 UWP 设备应用的设备同步和更新

注意

本主题对应于自定义 USB 设备示例。 自定义 USB 设备示例演示了一个使用 DeviceUseTrigger 执行设备同步的后台任务。

尽管自定义 USB 设备示例中的设备后台任务采用的是 DeviceUseTrigger,但本主题中讨论的所有内容也可以应用于使用 DeviceServicingTrigger 的设备后台任务。 使用这两个触发器的唯一区别在于 Windows 的策略检查。

应用清单

要使用设备后台任务,你的应用必须在前台应用的应用清单文件中声明,就像系统触发的后台任务一样。 有关详细信息,请参阅 UWP 设备应用的设备同步和更新

在此应用包清单文件示例中,DeviceLibrary.SyncContent 是前台应用的入口点。 DeviceLibrary.SyncContent 是使用 DeviceUseTrigger 的后台任务的入口点。

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

设备后台任务

设备后台任务类实现 IBackgroundTask 接口,并包含为同步或更新外围设备而创建的实际代码。 后台任务类会在后台任务触发时从你的应用的应用程序清单中提供的入口点执行。

自定义 USB 设备示例中的设备后台类包含使用 DeviceUseTrigger 后台任务对 USB 设备执行同步的代码。 有关完整详细信息,请下载示例。 有关实现 IBackgroundTask 和 Windows 后台任务基础结构的详细信息,请参阅使用后台任务支持应用

自定义 USB 设备示例中设备后台任务的关键部分包括:

  1. IoSyncBackgroundTask 类实现 Windows 后台任务基础结构所需的 IBackgroundTask 接口。

  2. IoSyncBackgroundTask 类获取 DeviceUseDetails 传递给类的 Run 方法中的 IoSyncBackgroundTask 类的实例,并使用此实例将进度报告回 Microsoft Store 应用并注册取消事件。

  3. IoSyncBackgroundTask 类的 Run 方法还调用实现后台设备同步代码的专用 OpenDevice 方法和 WriteToDeviceAsync 方法。

前台应用

自定义 USB 设备示例中的前台应用注册并触发使用 DeviceUseTrigger 的设备后台任务。 本部分概述了前台应用注册、触发和处理设备后台任务进度所要执行的步骤。

自定义 USB 设备示例中的前台应用执行以下步骤以使用设备后台任务:

  1. 创建新的 DeviceUseTriggerBackgroundTaskRegistration 对象。

  2. 检查此应用以前是否已注册任何后台任务,并通过对任务调用 BackgroundTaskRegistration.Unregister 方法取消这些任务。

  3. 专用 SetupBackgroundTask 方法注册将与设备同步的后台任务。 SetupBackgroundTask 方法在下一步中从 SyncWithDeviceAsync 方法调用。

    1. 初始化 DeviceUseTrigger 并保存它以供以后使用。

    2. 创建一个新的 BackgroundTaskBuilder 对象并使用其 NameTaskEntryPointSetTrigger 属性和方法注册应用的 DeviceUseTrigger 对象和后台任务名称。 BackgroundTaskBuilder 对象的 TaskEntryPoint 属性设置为在触发后台任务时将运行的后台任务类的全名。

    3. 注册后台任务中的完成和进度事件,以便前台应用可以向用户提供完成和进度更新。

  4. 专用 SyncWithDeviceAsync 方法注册将与设备同步并启动后台同步的后台任务。

    1. 从上一步调用 SetupBackgroundTask 方法,并注册将与设备同步的后台任务。

    2. 调用启动后台任务的专用 StartSyncBackgroundTaskAsync 方法。 该方法将应用的句柄关闭到设备,以确保后台任务能够在设备启动时打开设备。

      重要

      后台任务需要打开设备才能执行更新,以便前台应用在调用 RequestAsync之前必须关闭其与设备的连接。

    接下来,StartSyncBackgroundTaskAsync 方法调用 DeviceUseTrigger 对象的 RequestAsync 方法,该方法开始触发后台任务,并从 RequestAsync 返回对象 DeviceTriggerResults,用于确定是否成功启动后台任务。

    重要

    Windows 检查,以确保已完成所有必要的任务启动策略检查。 如果完成所有策略检查,则更新操作现在作为后台任务在前台应用外部运行,从而允许在操作正在进行时安全地挂起应用。 如果不再满足这些要求,Windows 还将强制实施任何运行时要求,并取消后台任务。

  5. 最后,SyncWithDeviceAsync 方法使用从 StartSyncBackgroundTaskAsync 返回的 DeviceTriggerResults 对象来确定后台任务是否已成功启动。 switch 语句用于检查 DeviceTriggerResults 的结果

  6. 前台应用实现了一个专用 OnSyncWithDeviceProgress 事件处理程序,它将根据设备后台任务的进度更新应用程序 UI。

  7. 前台应用实现了一个专用 OnSyncWithDeviceCompleted 事件处理程序,用于在后台任务完成时处理从后台任务到前台应用程序的过渡。

    1. 使用 BackgroundTaskCompletedEventArgs 对象的 CheckResults 方法来确定后台任务是否引发了异常。

    2. 后台任务完成后,前台应用会重新打开设备供应用程序使用,并更新 UI 以通知用户。

  8. 前台应用通过 UI 实现了专用按钮点击事件处理程序,以启动和取消后台任务。

    1. 专用 Sync_Click 事件处理程序调用前面步骤中所述的 SyncWithDeviceAsync 方法。

    2. 专用 CancelSync_Click 事件处理程序调用专用 CancelSyncWithDevice 方法以取消后台任务。

  9. 专用 CancelSyncWithDevice 方法取消注册并取消任何活动的设备同步,以便使用 BackgroundTaskRegistration.Unregister 方法重新打开设备。

自定义 USB 设备示例

UWP 设备应用的设备同步和更新

Launching, resuming, and multitasking

使用后台任务支持应用