這很重要
裝置元數據已被取代,將在未來的 Windows 版本中移除。 如需這項功能取代的相關信息,請參閱 驅動程式套件容器元數據。
您的 UWP 應用程式可以使用裝置背景工作程序來同步處理周邊裝置上的資料。 如果您的應用程式與裝置元數據相關聯,該 UWP 裝置應用程式也可以使用裝置背景代理程式來執行裝置更新,例如韌體更新。 裝置背景代理程式受限於原則,可確保使用者同意並協助在裝置同步處理和更新時保留電池使用時間。
若要執行裝置同步和更新作業,請分別建立使用 DeviceUseTrigger 和 DeviceServicingTrigger 的裝置背景工作。 若要瞭解如何使用 自定義 USB 裝置範例建立裝置背景工作,請參閱 建立裝置背景工作。
Windows 執行階段裝置 API 不需要裝置中繼資料。 這表示您的應用程式不需要是UWP裝置應用程式才能使用它們。 UWP 應用程式可以使用這些 API 來存取 USB、Human Interface Devices (HID)、藍牙裝置等等。 如需詳細資訊,請參閱 整合裝置。
裝置背景工作概觀
當使用者將 UWP 應用程式移出螢幕時,Windows 會暫停該應用程式於記憶體中,並讓另一個應用程式獲得前景狀態。 當應用程式暫停時,其會常駐於記憶體中,但 Windows 會阻止它執行。
任何進行中的裝置作業,例如同步和更新,在沒有裝置背景工作的協助下會被中斷。 Windows 提供兩個背景工作觸發程式來解決此問題:DeviceUseTrigger 和 DeviceServicingTrigger。 這些觸發程式可讓您的應用程式在背景安全地在周邊裝置上執行長時間執行的同步處理和更新作業,即使您的應用程式已暫停也一樣。 如需應用程式暫停的詳細資訊,請參閱啟動、繼續和多任務。
| 背景工作觸發器 | 需要裝置元數據 | 說明 |
|---|---|---|
| DeviceUseTrigger | 否 | 當您的應用程式暫停時,可讓您在周邊裝置上或從您的周邊裝置執行長時間執行的同步處理作業。 在背景同步您的裝置需要您的使用者核准應用程式的背景同步處理。 您的裝置必須與電腦連線或配對,並且具有作用中的輸入/輸出,以及最多允許 10 分鐘的背景活動。 本文稍後將詳細說明政策執行。 |
| 裝置服務觸發器 | 是的 | 啟用長時間執行的裝置更新,例如設定傳輸或韌體更新,同時暫停您的應用程式。 在背景更新裝置時,每次使用背景任務都需要用戶核准。 不同於 DeviceUseTrigger 背景工作,DeviceServicingTrigger 背景工作允許裝置重新啟動和中斷連線,並允許最多 30 分鐘的背景活動。 本文稍後將詳細說明政策執行。 |
DeviceServicingTrigger 需要裝置元數據,因為應用程式必須指定為特殊許可權應用程式,才能執行裝置更新作業。
應用程式許可權
特殊許可權應用程式可以執行一些重要的裝置作業,例如長時間執行的裝置更新。 特殊許可權應用程式是裝置製造商授權執行這些作業的應用程式。 裝置元數據會指定哪個應用程式,如果有的話,該應用程式被指定為裝置的特權應用程式。
使用裝置元數據精靈建立裝置元數據時,請在 [ 指定 UWP 裝置應用程式資訊 ] 頁面上指定您的應用程式。 如需詳細資訊,請參閱 步驟 2:建立 UWP 裝置應用程式的裝置元數據。
支援的通訊協定
使用 DeviceUseTrigger 和 DeviceServicingTrigger 的裝置背景工作可讓您的應用程式透過特定通訊協定與周邊裝置通訊。 UWP 應用程式通常所使用的系統觸發工作不支援這些通訊協定。
| 協定 | 設備服務觸發器 | 設備使用觸發器 | 系統觸發器 |
|---|---|---|---|
| USB |
|
|
|
| 隱藏 |
|
|
|
| 藍牙 RFCOMM |
|
|
|
| 藍牙 GATT |
|
|
|
| 媒體傳輸協定 (MTP) |
|
|
|
| 網路有線 |
|
|
|
| 網路 Wi-Fi |
|
|
|
| IDeviceIOControl |
|
|
|
在應用程式套件指令清單中註冊背景工作
您的應用程式會在程式代碼中執行同步處理和更新作業,以作為背景工作的一部分執行。 此程式代碼內嵌在實作IBackgroundTask的 Windows 運行時間類別中(或 JavaScript 應用程式的專用 JavaScript 頁面)。 若要使用裝置背景工作,您的應用程式必須在前景應用程式的應用程式指令清單檔案中宣告它,就像系統觸發的背景工作一樣。
在此應用程式套件指令清單檔案的範例中, DeviceLibrary.SyncContent 和 DeviceLibrary.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 背景工作,請遵循這組基本步驟。 如需背景工作的詳細資訊,請參閱 使用背景工作支援您的應用程式。
您的應用程式會在應用程式指令清單中註冊其背景工作,並將背景工作程式碼內嵌於實作 IBackgroundTask 的 Windows 執行階段類別中,或放置於 JavaScript 應用程式的專用 JavaScript 頁面中。
當您的應用程式啟動時,它會建立並設定適當類型的裝置觸發程序物件,即 DeviceUseTrigger 或 DeviceServicingTrigger,並儲存觸發程式實例以供日後使用。
您的應用程式會檢查背景任務是否先前已註冊,如果沒有,則會將其針對裝置觸發器進行註冊。 不允許您的應用程式設定與此觸發程式相關聯的工作條件。
當您的應用程式需要觸發背景工作時,它會在裝置觸發程式物件上呼叫 RequestAsync 啟用方法。
您的背景工作不會像其他系統背景工作一樣進行節流處理(沒有 CPU 時間配額),但會以較低的優先順序執行,讓前景應用程式保持回應。
根據觸發程式類型,Windows 會驗證是否符合必要的原則,包括在啟動背景工作之前要求使用者同意作業。
Windows 會監視系統條件和工作運行時間,如有必要,如果不再符合必要條件,則會取消工作。
當背景工作報告進度或完成時,您的應用程式會透過已註冊工作上的進度和已完成的事件接收這些事件。
使用裝置背景工作時要考慮的要點
以程式設計方式觸發使用DeviceUseTrigger和DeviceServicingTrigger的背景工作的能力僅限於裝置背景工作。
Windows 會強制執行特定原則,以確保使用者在更新其周邊裝置時同意。 在同步和更新周邊裝置時,會強制執行更多原則來保留使用者電池使用時間。
當特定原則需求不再符合時,Windows 可能會取消使用 DeviceUseTrigger 和 DeviceServicingTrigger 的背景工作,包括背景時間上限(時鐘時間)。 使用這些背景工作與周邊裝置互動時,請務必考慮這些政策要求。
小提示
若要查看這些背景工作的運作方式,請下載範例。 自訂 USB 裝置範例展示如何使用 DeviceUseTrigger 在背景工作中執行裝置同步。
使用者同意
當您的應用程式使用DeviceUseTrigger或DeviceServicingTrigger時,Windows 會強制執行原則,以確保使用者在背景中授與應用程式存取其裝置的許可權,以便同步處理和更新內容。 原則也會強制執行,以協助在同步和更新周邊裝置時保留使用者電池使用時間。
裝置同步使用者同意
使用 DeviceUseTrigger 的背景任務需要一次性使用者授權,讓您的應用程式能夠在背景進行同步。 此同意會按應用程式及設備型號逐一儲存。 使用者同意讓應用程式在背景存取裝置,就像他們同意讓應用程式在前景時存取裝置一樣。
在下列範例中,名叫 Tailspin Toys 的應用程式會取得使用者在背景同步的授權。
如果使用者稍後會改變想法,他們可以撤銷 [設定] 中的許可權。
裝置更新使用者同意
不同於使用 DeviceUseTrigger 的背景工作,使用 DeviceServicingTrigger 的背景工作在每次觸發時都需要使用者同意。 此同意並不像 DeviceUseTrigger 一樣儲存。 這是因為裝置韌體更新牽涉到高風險的作業,而且需要更多時間才能完成。
Windows 也會為使用者提供裝置更新的相關信息。 這包括在更新期間要求保持裝置連線,並確保電腦已充電。 如果您的應用程式提供作業,Windows 也會顯示作業的大約運行時間。
頻率和前景限制
您的應用程式可以起始作業的頻率沒有限制,但您的應用程式一次只能執行一個 DeviceUseTrigger 或 DeviceServicingTrigger 背景工作作業(這不會影響其他類型的背景工作),而且只能在您的應用程式處於前景時起始背景工作。 當您的應用程式未處於前景時,將無法使用 DeviceUseTrigger 或 DeviceServicingTrigger 來啟動背景工作。 您的應用程式無法在第一個背景工作完成之前起始第二個裝置背景工作。
裝置背景工作原則
當您的應用程式使用裝置背景工作時,Windows 會強制執行原則。 如果不符合這些政策,使用 DeviceUseTrigger 或 DeviceServicingTrigger 的背景工作可能會被取消。 使用裝置背景工作與周邊裝置互動時,請務必考慮這些原則需求。
工作初始原則
下表指出哪些工作初始原則會套用至每個背景工作觸發程式。
| 原則 | 設備服務觸發器 | 設備使用觸發器 |
|---|---|---|
| 當觸發背景工作時,您的UWP應用程式正處於前景狀態。 |
|
|
| 您的裝置已連接到系統(或處於無線裝置的範圍內)。 |
|
|
| 背景工作會在鎖定螢幕時每分鐘耗用 400 毫秒的 CPU 時間(假設 1GHz CPU),或螢幕未鎖定時每 5 分鐘。 不符合此原則可能會導致工作取消。 |
|
|
| 您的應用程式可以透過裝置周邊介面 API 存取您的裝置(適用於 USB、HID、藍牙等的 Windows 執行階段 API)。 如果您的 app 無法存取裝置,則會拒絕存取背景工作。 |
|
|
| 應用程式所提供的背景任務進入點會在應用程式套件指令清單中註冊。 |
|
|
| 使用者已允許任務繼續進行。 | 每次。 | 第一次,接著由應用程式權限控制。 |
| 應用程式所提供的時間估計小於30分鐘。 |
|
|
| 應用程式被指定為裝置的特權應用程式。 (必須符合裝置容器的裝置元數據中具有特殊許可權的應用程式清單的完整應用程式識別碼。) |
|
|
| 計算機剩餘的電池容量超過 33%,或處於 AC 電源上。 |
|
|
| 每個作業類型只會執行一個裝置背景工作。 |
|
|
執行期間原則檢查
當您的工作在背景中執行時,Windows 會強制執行下列運行時間原則需求。 如果任何執行時需求不再符合,Windows 將會取消您的裝置背景任務。
下表指出哪些運行時間原則會套用至每個背景工作觸發程式。
| 政策檢查 | 設備服務觸發器 | 設備使用觸發器 |
|---|---|---|
| 時鐘時間限制 – 應用程式工作可以在背景執行的總時間量。 | 30 分鐘 | 10 分鐘 |
| 您的裝置已連接到系統(或處於無線裝置的範圍內)。 |
|
|
| 工作正在對裝置執行定期 I/O(每 5 秒進行 1 次 I/O)。 |
|
|
| 應用程式尚未取消工作。 |
|
|
| 應用程式尚未退出。 |
|
|
最佳做法
以下是使用裝置背景工作的UWP裝置應用程式最佳做法。
裝置背景工作程序設計模型
從應用程式中使用 DeviceUseTrigger 或 DeviceServicingTrigger 背景工作,可以確保如果使用者切換應用程式而導致您的前景應用程式被 Windows 暫停,任何從前景應用程式啟動的同步處理或裝置更新作業仍然能在背景中持續運行。 我們建議您遵循此整體模型來註冊、觸發和解除註冊您的背景工作:
在要求觸發程式之前,請先註冊背景工作。
將進度和完成事件處理程式連接至您的觸發程式。 當您的應用程式從暫停返回時,Windows 會提供您的應用程式任何佇列的進度或完成事件,可用來判斷背景工作的狀態。
當您觸發 DeviceUseTrigger 或 DeviceServicingTrigger 背景工作時,請關閉任何已開啟的裝置物件,讓這些裝置能夠被背景工作使用。
註冊觸發器。
當工作完成時,請取消註冊背景工作。 當您的背景工作完成時,您可以取消註冊背景工作,然後重新開啟裝置,並定期從 UWP 應用程式使用它。
請從您的背景工作類別中註冊取消事件。 註冊取消事件可讓您的背景工作任務程式碼在被 Windows 或前景應用程式取消時,順利停止正在運行的背景工作任務。
在應用程式結束時(非暫停),取消註冊並取消任何執行中的工作。
當您的應用程式結束時,請取消註冊並取消任何執行中的工作。
當您的應用程式結束時,背景工作會取消,而且任何現有的事件處理程式會與現有的背景工作中斷連線。 這可防止您判斷背景工作的狀態。 取消註冊並終止背景工作可讓您的取消代碼順利停止此背景工作。
小提示
如需如何使用 自定義 USB 裝置範例完成這項作業的詳細描述,請參閱 建立裝置背景工作。
取消背景工作
若要從前景應用程式取消在背景中執行的工作,請使用您在 app 中使用的 BackgroundTaskRegistration 物件上的 Unregister 方法來註冊 DeviceUseTrigger 或 DeviceServicingTrigger 背景工作。 在 BackgroundTaskRegistration 上使用 Unregister 方法來取消註冊背景工作,會使背景工作基礎架構取消該背景工作。
Unregister 方法會額外接收布爾值 true 或 false,指示當前執行中的背景工作是否應被取消,而不允許完成。 如需詳細資訊,請參閱 BackgroundTaskRegistration.Unregister 的 API 參考。