在 Windows 8.1 中创建设备后台任务(UWP 设备应用)
在 Windows 8.1 中,UWP 应用可以同步外围设备上的数据。 如果你的应用与设备元数据相关联,则该 UWP 设备应用还可以执行设备更新,例如固件更新。 本主题介绍如何创建使用 DeviceUseTrigger 或 DeviceServicingTrigger 的设备后台任务。 使用这些触发器的设备后台代理需遵守相关策略,以确保用户同意,并在设备同步和更新时帮助保持电池寿命。 有关设备后台任务的详细信息,请参阅 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 设备示例中设备后台任务的关键部分包括:
IoSyncBackgroundTask
类实现 Windows 后台任务基础结构所需的IBackgroundTask
接口。该
IoSyncBackgroundTask
类获取DeviceUseDetails
传递给类的 Run 方法中的IoSyncBackgroundTask
类的实例,并使用此实例将进度报告回 Microsoft Store 应用并注册取消事件。IoSyncBackgroundTask
类的 Run 方法还调用实现后台设备同步代码的专用OpenDevice
方法和WriteToDeviceAsync
方法。
前台应用
自定义 USB 设备示例中的前台应用注册并触发使用 DeviceUseTrigger 的设备后台任务。 本部分概述了前台应用注册、触发和处理设备后台任务进度所要执行的步骤。
自定义 USB 设备示例中的前台应用执行以下步骤以使用设备后台任务:
创建新的 DeviceUseTrigger 和
BackgroundTaskRegistration
对象。检查此应用以前是否已注册任何后台任务,并通过对任务调用 BackgroundTaskRegistration.Unregister 方法取消这些任务。
专用
SetupBackgroundTask
方法注册将与设备同步的后台任务。SetupBackgroundTask
方法在下一步中从SyncWithDeviceAsync
方法调用。初始化
DeviceUseTrigger
并保存它以供以后使用。创建一个新的
BackgroundTaskBuilder
对象并使用其Name
、TaskEntryPoint
和SetTrigger
属性和方法注册应用的DeviceUseTrigger
对象和后台任务名称。BackgroundTaskBuilder
对象的TaskEntryPoint
属性设置为在触发后台任务时将运行的后台任务类的全名。注册后台任务中的完成和进度事件,以便前台应用可以向用户提供完成和进度更新。
专用
SyncWithDeviceAsync
方法注册将与设备同步并启动后台同步的后台任务。从上一步调用
SetupBackgroundTask
方法,并注册将与设备同步的后台任务。调用启动后台任务的专用
StartSyncBackgroundTaskAsync
方法。 该方法将应用的句柄关闭到设备,以确保后台任务能够在设备启动时打开设备。重要
后台任务需要打开设备才能执行更新,以便前台应用在调用
RequestAsync
之前必须关闭其与设备的连接。
接下来,
StartSyncBackgroundTaskAsync
方法调用DeviceUseTrigger
对象的RequestAsync
方法,该方法开始触发后台任务,并从RequestAsync
返回对象DeviceTriggerResults
,用于确定是否成功启动后台任务。重要
Windows 检查,以确保已完成所有必要的任务启动策略检查。 如果完成所有策略检查,则更新操作现在作为后台任务在前台应用外部运行,从而允许在操作正在进行时安全地挂起应用。 如果不再满足这些要求,Windows 还将强制实施任何运行时要求,并取消后台任务。
最后,
SyncWithDeviceAsync
方法使用从StartSyncBackgroundTaskAsync
返回的DeviceTriggerResults
对象来确定后台任务是否已成功启动。 switch 语句用于检查DeviceTriggerResults
的结果前台应用实现了一个专用
OnSyncWithDeviceProgress
事件处理程序,它将根据设备后台任务的进度更新应用程序 UI。前台应用实现了一个专用
OnSyncWithDeviceCompleted
事件处理程序,用于在后台任务完成时处理从后台任务到前台应用程序的过渡。使用
BackgroundTaskCompletedEventArgs
对象的CheckResults
方法来确定后台任务是否引发了异常。后台任务完成后,前台应用会重新打开设备供应用程序使用,并更新 UI 以通知用户。
前台应用通过 UI 实现了专用按钮点击事件处理程序,以启动和取消后台任务。
专用
Sync_Click
事件处理程序调用前面步骤中所述的SyncWithDeviceAsync
方法。专用
CancelSync_Click
事件处理程序调用专用CancelSyncWithDevice
方法以取消后台任务。
专用
CancelSyncWithDevice
方法取消注册并取消任何活动的设备同步,以便使用 BackgroundTaskRegistration.Unregister 方法重新打开设备。