從背景工作存取感應器和裝置

DeviceUseTrigger 可讓您的通用 Windows 應用程式在背景存取感應器和周邊裝置,即使您的前景應用程式已暫停也一樣。 例如,視您的應用程式執行位置而定,它可以使用背景工作來同步處理與裝置或監視感測器的資料。 為了協助保留電池使用時間並確保適當的使用者同意,使用 DeviceUseTrigger 受限於本主題中所述的原則。

若要存取背景中的感測器或周邊裝置,請建立使用 DeviceUseTrigger 的背景工作。 如需示範如何在計算機上完成這項作業的範例,請參閱 自訂 USB 裝置範例。 如需手機上的範例,請參閱背景感測器範例

重要

DeviceUseTrigger 無法與同程序背景工作搭配使用。 本主題中的資訊僅適用於跨程序的背景工作。

裝置背景工作概觀

當使用者不再看到您的應用程式時,Windows 將會暫停或終止您的應用程式,以回收記憶體和 CPU 資源。 這可讓其他應用程式在前景執行,並減少電池耗用量。 發生這種情況時,如果沒有背景工作的說明,任何進行中的資料事件都會遺失。 Windows 提供背景工作觸發程式 DeviceUseTrigger,讓您的 app 在背景安全地在裝置和感測器上執行長時間執行的同步處理和監視作業,即使您的應用程式已暫停也一樣。 如需應用程式生命週期的詳細資訊,請參閱啟動、繼續和背景工作。 如需背景工作的詳細資訊,請參閱使用背景工作支援您的應用程式

注意在通用 Windows 應用程式中,在背景同步處理裝置時,您的使用者必須已核准應用程式的背景同步處理。 裝置也必須連線到計算機或與計算機配對,且具有作用中的 I/O,且最多允許 10 分鐘的背景活動。 本主題稍後將詳細說明原則強制執行。

限制:重大裝置作業

某些重要的裝置作業,例如長時間執行的韌體更新,無法使用 DeviceUseTrigger來執行。 這類作業只能在電腦上執行,而且只能由使用 DeviceServicingTrigger 的特殊許可權應用程式執行。 特殊許可權應用程式是裝置製造商授權執行這些作業的應用程式。 裝置中繼資料是用來指定哪個應用程式,如果有的話,已指定為裝置的特殊權限應用程式。 如需詳細資訊,請參閱 Microsoft Store 裝置應用程式的裝置同步處理和更新

DeviceUseTrigger 背景工作支持的通訊協定/API

使用 DeviceUseTrigger 的背景工作可讓您的應用程式透過許多通訊協定/API 進行通訊,其中大部分不受系統觸發的背景工作支援。 通用 Windows 應用程式支援下列專案。

通訊協定 通用 Windows 應用程式中的 DeviceUseTrigger
USB this protocol is supported.
HID this protocol is supported.
藍牙 RFCOMM this protocol is supported.
Bluetooth GATT this protocol is supported.
MTP this protocol is supported.
有線網路 this protocol is supported.
網路 Wi-Fi this protocol is supported.
IDeviceIOControl deviceservicingtrigger supports ideviceiocontrol
感應器 API deviceservicingtrigger supports universal sensors apis(僅限於通用裝置系列中的感測器)

在應用程式套件指令清單中註冊背景工作

您的應用程式會在在背景工作中執行的程式代碼中執行同步處理和更新作業。 此程式代碼內嵌在實作 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,請遵循這些基本步驟。 如需背景工作的資訊,請參閱使用背景工作支援您的應用程式

  1. 您的應用程式在應用程式清單中註冊其背景任務,並將背景任務程式碼嵌入到實作 IBackgroundTask 的 Windows 執行時間類別中或 JavaScript 應用程式的專用 JavaScript 頁面中。
  2. 當您的應用程式啟動時,它會建立並設定 DeviceUseTrigger類型的觸發程式物件,並儲存觸發程式執行個體以供日後使用。
  3. 您的應用程式會檢查背景工作是否先前已註冊,如果不是,則會針對觸發程式進行註冊。 請注意,您的應用程式不允許在與此觸發程式相關聯的工作上設定條件。
  4. 當您的應用程式需要觸發背景工作時,它必須先呼叫 RequestAccessAsync 來檢查應用程式是否能夠要求背景工作。
  5. 如果應用程式可以要求背景工作,它會在裝置觸發程序物件上呼叫 RequestAsync 啟用方法。
  6. 您的背景任務不會像其他系統背景任務那樣受到限制 (沒有 CPU 時間配額),但會以降低的優先順序運行,以保持前台應用程式的回應能力。
  7. 接著,Windows 會根據觸發程式類型來驗證已符合必要原則,包括在啟動背景工作之前要求使用者同意作業。
  8. Windows 監視系統狀況和任務運行時間,並在必要時在不再滿足所需條件時取消任務。
  9. 當背景工作報告進度或完成時,您的應用程式會透過已註冊工作上的進度和已完成事件來接收這些事件。

重要在使用 DeviceUseTrigger,請考慮這些重要點:

  • 在 Windows 8.1 和 Windows 電話 8.1 中首次引進以程式設計方式觸發使用 DeviceUseTrigger 的背景工作的能力。

  • Windows 會強制執行某些原則,以確保在更新電腦上的周邊裝置時,使用者同意。

  • 在同步和更新周邊裝置時,會強制執行額外的原則,以保留使用者的電池使用時間。

  • 當特定原則需求不再符合時,Windows 可能會取消使用 DeviceUseTrigger 的背景工作,包括背景時間上限 (時鐘時間)。 使用這些背景工作與周邊裝置互動時,請務必考慮這些原則需求。

秘訣若要了解這些背景工作的運作方式,請下載範例。 如需示範如何在計算機上完成這項作業的範例,請參閱 自訂 USB 裝置範例。 如需手機上的範例,請參閱背景感測器範例。  

頻率和前景限制

您的應用程式可以起始作業的頻率沒有限制,但您的應用程式一次只能執行一個 DeviceUseTrigger 背景工作作業 (這不會影響其他類型的背景工作),而且只能在您的應用程式處於前景時起始背景工作。 當您的應用程式不在前景時,就無法使用 DeviceUseTrigger 起始背景工作。 您的應用程式無法在第一個背景工作完成之前起始第二個 DeviceUseTrigger 背景工作。

裝置限制

雖然每個應用程式只能註冊並執行一個 DeviceUseTrigger 背景工作,但裝置 (您的應用程式執行所在的裝置) 可能會允許多個應用程式註冊並執行 DeviceUseTrigger 背景工作。 視裝置而定,可能會限制來自所有應用程式的 DeviceUseTrigger 背景工作總數。 這有助於在資源受限的裝置上保留電池。 如需詳細資訊,請參閱下表。

從單一 DeviceUseTrigger 背景工作,您的應用程式可以存取不限數量的周邊裝置或感測器,僅受上表所列支援的 API 和通訊協定所限制。

背景工作原則

當您的應用程式使用 DeviceUseTrigger 背景工作時,Windows 會強制執行原則。 如果不符合這些原則,背景工作可能會取消。 使用這種類型的背景工作來與裝置或感測器互動時,請務必考慮這些原則需求。

工作初始原則

下表指出哪些工作初始原則適用於通用 Windows 應用程式。

原則 通用 Windows 應用程式中的 DeviceUseTrigger
觸發背景工作時,您的應用程式位於前景。 policy applies
裝置會連接到系統 (或無線裝置的範圍)。 policy applies
您可以使用支援的裝置周邊 API 來存取應用程式 (適用於 USB、HID、藍牙、Sensors 等 Windows 執行階段 API)。 如果您的應用程式無法存取裝置或感測器,則會拒絕存取背景工作。 policy applies
應用程式所提供的背景工作進入點會在應用程式套件指令清單中註冊。 policy applies
每個應用程式只會執行一個 DeviceUseTrigger 背景工作。 policy applies
裝置上尚未達到 DeviceUseTrigger 背景工作的數目上限 (您的應用程式正在執行中)。 傳統型裝置系列:可以註冊並平行執行無限制的工作數目。 行動裝置系列:512 MB 裝置上的 1 個工作;否則,可以同時註冊並執行 2 個工作。
使用支援的 API/通訊協定時,您的應用程式可以從單一 DeviceUseTrigger 背景工作存取的周邊裝置或感測器數目上限。 無限制
背景工作會在鎖定螢幕時每分鐘耗用 400 毫秒的 CPU 時間 (假設 1GHz CPU),或螢幕未鎖定時每 5 分鐘。 不符合此原則可能會導致工作取消。 policy applies

運行時間原則檢查

當您的工作在背景中執行時,Windows 會強制執行下列運行時間原則需求。 如果任何運行時間需求停止為 true,Windows 將會取消您的裝置背景工作。

此表指示哪些執行時間策略適用於通用 Windows 應用程式。

原則檢查 通用 Windows 應用程式中的 DeviceUseTrigger
裝置會連接到系統 (或無線裝置的範圍)。 policy check applies
工作正在對裝置執行一般 I/O (每 5 秒 1 個 I/O)。 policy check applies
應用程式尚未取消工作。 policy check applies
時鐘時間限制 – 應用程式工作可以在背景執行的總時間量。 傳統型裝置系列:10 分鐘。 行動裝置系列:沒有時間限制。 若要節省資源,一次不能執行超過1或2個工作。
應用程式尚未結束。 policy check applies

最佳作法

以下是使用 DeviceUseTrigger 背景工作之應用程式的最佳做法。

設計背景工作

使用來自您應用程式的 DeviceUseTrigger 背景工作可確保如果使用者切換應用程式和 Windows 暫停前景應用程式,任何從前景應用程式啟動的同步或監視作業,仍會繼續在背景執行。 建議您遵循此整體模型來註冊、觸發和取消註冊背景工作:

  1. 呼叫 RequestAccessAsync 來檢查應用程式是否能夠要求背景工作。 這必須先完成,才能註冊背景工作。

  2. 要求觸發程式之前,請先註冊背景工作。

  3. 連線觸發程序的進度和完成事件處理程式。 當您的應用程式從暫停返回時,Windows 會提供您的應用程式任何佇列的進度或完成事件,可用來判斷背景工作的狀態。

  4. 當您觸發 DeviceUseTrigger 背景工作時,關閉任何開啟的裝置或感測器物件,讓這些裝置或感測器可供背景工作開啟及使用。

  5. 註冊觸發程式。

  6. 請仔細考慮從背景工作存取裝置或感性裝置的電池影響。 例如,如果感測器執行的報告間隔太頻繁,可能會導致工作經常執行,使其快速耗盡手機的電池。

  7. 當背景工作完成時,請取消註冊。

  8. 註冊背景工作類別中的取消事件。 註冊取消事件可讓背景工作程序代碼在 Windows 或前景應用程式取消時,明確地停止執行中的背景工作。

  9. 在應用程式結束 (而非暫停) 上,如果您的應用程式不再需要,請取消註冊並取消任何執行中的工作。 在資源受限的系統上,例如記憶體不足的手機,這可讓其他應用程式使用 DeviceUseTrigger 背景工作。

    • 當您的應用程式結束時,請取消註冊並取消任何執行中的工作。

    • 當您的應用程式結束時,背景工作將會取消,而且任何現有的事件處理程式都會與現有的背景工作中斷連線。 這可防止您判斷背景工作的狀態。 取消註冊和取消背景工作可讓您的取消程式代碼清除背景工作。

取消背景工作

若要從前景應用程式取消在背景中執行的工作,請使用您在 app 中使用的 BackgroundTaskRegistration 物件上的 Unregister 方法來註冊 DeviceUseTrigger 背景工作。 使用 BackgroundTaskRegistration 上的 Unregister 方法取消註冊背景工作,會導致背景工作基礎結構取消背景工作。

Unregister 方法會額外採用布爾值 true 或 false 值,以指出目前執行中背景工作的執行個體是否應該取消,而不允許它們完成。 有關詳細資訊,請參閱 Unregister 的 API 參考。

除了 Unregister 之外,您的應用程式也需要呼叫 BackgroundTaskDeferral.Complete 這會通知系統與背景工作相關聯的非同步操作已完成。