从后台任务访问传感器和设备
DeviceUseTrigger 允许你的通用 Windows 应用访问后台中的传感器和外围设备,即使在前台应用暂停时也是如此。 例如,根据应用正在运行的位置,它可以使用后台任务将数据与设备或监视传感器同步。 为了帮助保持电池使用时间并确保适当的用户同意,使用 DeviceUseTrigger 会遵循本主题中所述的策略。
若要访问后台的传感器或外围设备,请创建使用 DeviceUseTrigger 的后台任务。 有关演示如何在电脑上执行此操作的示例,请参阅 自定义 USB 设备示例。 有关手机上的示例,请参阅 后台传感器示例。
重要
DeviceUseTrigger 不能与进程内后台任务一起使用。 本主题中的信息仅适用于进程外运行的后台任务。
设备后台任务概述
当用户不再看到你的应用时,Windows 将暂停或终止你的应用以回收内存和 CPU 资源。 这样,其他应用就可以在前台运行并减少电池消耗。 发生这种情况时,如果没有后台任务的帮助,任何正在进行的数据事件都将丢失。 Windows 提供后台任务触发器 DeviceUseTrigger,让你的应用在后台安全地对设备和传感器执行长时间运行的同步和监视操作,即使应用已暂停也是如此。 有关应用生命周期的详细信息,请参阅 启动、恢复和后台任务。 有关后台任务的详细信息,请参阅 使用后台任务支持应用。
请注意 ,在通用 Windows 应用中,在后台同步设备需要用户已批准应用进行后台同步。 设备还必须连接到电脑或与电脑配对,并且允许最多 10 分钟的后台活动。 本主题稍后将介绍有关策略强制实施的更多详细信息。
限制:关键设备操作
某些关键设备操作(如长时间运行的固件更新)无法通过 DeviceUseTrigger 执行。 此类操作仅可以在电脑上通过使用 DeviceServicingTrigger 的特权应用执行。 特权应用是指由设备制造商授权执行这些操作的应用。 设备元数据用于指定已指派哪个应用(如果有)作为设备的特权应用。 有关详细信息,请参阅 Microsoft应用商店设备应用的设备同步和更新。
DeviceUseTrigger 后台任务支持的协议/API
使用 DeviceUseTrigger 的后台任务允许应用通过许多协议/API 进行通信,其中大多数协议/API 不受系统触发的后台任务支持。 通用 Windows 应用支持以下各项。
协议 | 通用 Windows 应用中的 DeviceUseTrigger |
---|---|
USB | |
HID | |
蓝牙 RFCOMM | |
蓝牙 GATT | |
MTP | |
有线网络 | |
网络和 Wi-Fi | |
IDeviceIOControl | |
传感器 API | (仅限于通用设备系列中的传感器) |
在应用包清单中注册后台任务
你的应用将在作为后台任务的一部分运行的代码中执行同步和更新操作。 此代码嵌入在实现 IBackgroundTask 的Windows 运行时类中(或在 JavaScript 应用的专用 JavaScript 页面中)。 若要使用 DeviceUseTrigger 后台任务,应用必须在前台应用的应用清单文件中声明它,就像对系统触发的后台任务一样。
在此应用包清单文件中,DeviceLibrary.SyncContent 是使用 DeviceUseTrigger 的后台任务的入口点。
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="DeviceLibrary.SyncContent">
<BackgroundTasks>
<m2:Task Type="deviceUse" />
</BackgroundTasks>
</Extension>
</Extensions>
使用 DeviceUseTrigger 简介
若要使用 DeviceUseTrigger,请按照以下基本步骤操作。 有关后台任务的详细信息,请参阅 使用后台任务支持应用。
- 你的应用会在应用清单中注册其后台任务,并将后台任务代码嵌入到实现 IBackgroundTask 的 Windows 运行时类中,或嵌入到 JavaScript 应用的专用 JavaScript 页面中。
- 应用启动时,它将创建并配置 DeviceUseTrigger 类型的触发器对象,并存储触发器实例以供将来使用。
- 应用会检查后台任务是否已注册,如果尚未注册,则针对触发器注册该任务。 请注意,不允许应用针对与此触发器关联的任务设置条件。
- 当你的应用需要触发后台任务时,它必须首先调用 RequestAccessAsync 来检查应用是否能够请求后台任务。
- 如果应用可以请求后台任务,它会在设备触发器对象上调用 RequestAsync 激活方法。
- 后台任务与其他系统后台任务(没有 CPU 时间配额)一样不受限制,但会以降低优先级运行,使前台应用保持响应。
- 然后,Windows 将根据触发器类型验证是否满足必要的策略要求,包括在启动后台任务前征求用户对操作的同意。
- Windows 监视系统条件和任务运行时,如有必要,会在不再满足所需条件时取消任务。
- 当后台任务报告进度或完成时,应用将通过已注册任务的进度和已完成事件接收这些事件。
重要提示 使用 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 时间(假设 CPU 频率为 1GHz);当屏幕未锁定时,每 5 分钟消耗 400 毫秒的 CPU 时间。 未能满足此策略可能会导致任务取消。 |
运行时策略检查
任务在后台运行时,Windows 会强制执行以下运行时策略要求。 如果运行时要求中的任何一项不再为 true,Windows 将取消设备后台任务。
此表指示哪些运行时策略适用于通用 Windows 应用。
策略检查 | 通用 Windows 应用中的 DeviceUseTrigger |
---|---|
设备连接到系统(或无线设备的范围)。 | |
任务正在对设备执行常规 I/O(每 5 秒 1 次 I/O)。 | |
应用尚未取消任务。 | |
时钟时间限制 – 应用任务可以在后台运行的总时间。 | 桌面设备系列:10 分钟。 移动设备系列:无时间限制。 若要节省资源,一次最多可以执行 1 个或 2 个任务。 |
应用尚未退出。 |
最佳做法
下面是使用 DeviceUseTrigger 后台任务的应用的最佳做法。
对后台任务进行编程
使用应用中的 DeviceUseTrigger 后台任务可确保从前台应用启动的任何同步或监视操作在后台继续运行(如果用户切换应用和前台应用被 Windows 挂起)。 建议遵循此总体模型来注册、触发和取消注册后台任务:
调用 RequestAccessAsync 以检查应用是否能够请求后台任务。 必须在注册后台任务之前完成此操作。
在请求触发器之前注册后台任务。
将进度和完成事件处理程序连接到触发器。 当你的应用从挂起返回时,Windows 将为应用提供可用于确定后台任务状态的任何排队进度或完成事件。
触发 DeviceUseTrigger 后台任务时关闭任何打开的设备或传感器对象,以便后台任务可以自由打开和使用这些设备或传感器。
注册触发器。
仔细考虑从后台任务访问设备或传感器的电池影响。 例如,如果传感器运行的报告间隔太频繁,可能会导致任务经常运行,从而快速耗尽手机的电池。
后台任务完成后,请注销它。
从后台任务类注册取消事件。 注册取消事件可让你的后台任务代码在被 Windows 或前台应用程序取消时彻底停止正在运行的后台任务。
在应用退出(未挂起)上,如果应用不再需要任何正在运行的任务,请取消注册和取消任何正在运行的任务。 在资源受限的系统(如低内存手机)上,这将允许其他应用使用 DeviceUseTrigger 后台任务。
应用退出时,取消注册并取消任何正在运行的任务。
应用退出时,将取消后台任务,任何现有的事件处理程序都将与现有的后台任务断开连接。 这样你就无法确定后台任务的状态。 取消注册和取消后台任务将允许你的取消代码彻底停止后台任务。
取消后台任务
若要从前台应用取消在后台运行的任务,请在应用中使用的 BackgroundTaskRegistration 对象上使用 Unregister 方法注册 DeviceUseTrigger 后台任务。 使用 BackgroundTaskRegistration 上的 Unregister 方法取消注册后台任务将导致后台任务基础结构取消后台任务。
Unregister 方法还采用布尔值 true 或 false 值,以指示当前正在运行的后台任务实例是否应取消,而不允许它们完成。 有关详细信息,请参阅注销的 API 参考。
除了注销,应用还需要调用 BackgroundTaskDeferral.Complete。 这会通知系统与后台任务关联的异步操作已完成。