共用方式為


在 Windows 8.1 中建立裝置背景工作 (UWP 裝置應用程式)

這很重要

裝置元數據已被取代,將在未來的 Windows 版本中移除。 如需這項功能取代的相關信息,請參閱 驅動程式套件容器元數據

您的 UWP 應用程式可以同步處理周邊裝置上的數據。 如果您的 app 與裝置元數據相關聯,該 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 會實作 IBackgroundTask Windows 背景工作基礎結構所需的介面。

  2. IoSyncBackgroundTask 類別在其 Run 方法中取得了傳遞至 IoSyncBackgroundTask 類別的 DeviceUseDetails 實例,並使用此實例將進度回報至 Microsoft Store 應用和註冊取消事件。

  3. 類別 IoSyncBackgroundTask 的 Run 方法也會呼叫實作背景裝置同步程式代碼的私人 OpenDeviceWriteToDeviceAsync 方法。

前景應用程式

自定義 USB 裝置範例中的前景應用程式會註冊,並觸發使用 DeviceUseTrigger 的裝置背景工作。 本節概述前景應用程式將採取的步驟,以註冊、觸發及處理裝置背景工作的進度。

自訂 USB 裝置範例中的前景應用程式會執行下列步驟來使用裝置背景工作:

  1. 建立新的 DeviceUseTriggerBackgroundTaskRegistration 物件。

  2. 檢查此應用程式先前是否已註冊任何背景工作,並藉由在工作上呼叫 BackgroundTaskRegistration.Unregister 方法來取消工作。

  3. 私有 SetupBackgroundTask 方法會註冊與裝置同步的背景工作。 方法 SetupBackgroundTask 會在下一個步驟中從 SyncWithDeviceAsync 方法呼叫。

    1. 初始化DeviceUseTrigger並將其儲存以供稍後使用。

    2. 建立新的 BackgroundTaskBuilder 物件,並使用其 NameTaskEntryPointSetTrigger 屬性和 方法來註冊應用程式 DeviceUseTrigger 的物件和背景工作名稱。 對象的 BackgroundTaskBuilderTaskEntryPoint 屬性會設定為觸發背景工作時所要執行之背景工作類別的完整名稱。

    3. 從背景工作註冊完成和進度事件,讓前景應用程式可以提供完成和進度更新給使用者。

  4. 私有SyncWithDeviceAsync方法會註冊與裝置同步的背景任務,並開始背景同步處理。

    1. 在上一個步驟中呼叫 SetupBackgroundTask 方法,並註冊將與裝置同步的背景工作。

    2. 呼叫私有 StartSyncBackgroundTaskAsync 方法以啟動背景工作。 該方法會關閉應用程式的裝置句柄,以確保背景工作能夠在裝置啟動時開啟裝置。

      這很重要

      背景工作需要開啟裝置以執行更新,因此前景應用程式必須先關閉其與裝置的連線,然後才能呼叫 RequestAsync

    接下來,StartSyncBackgroundTaskAsync 方法會呼叫 DeviceUseTrigger 物件的 RequestAsync 方法,該方法會開始背景工作,並從 RequestAsync 中傳回 DeviceTriggerResults 物件,用於判斷背景工作是否成功啟動。

    這很重要

    Windows 檢查以確保所有必要的任務啟動的政策檢查都已完成。 如果已完成所有原則檢查,更新作業現在會以前景應用程式以外的背景工作的形式執行,讓應用程式在作業進行時安全地暫停。 如果不再符合這些需求,Windows 也會強制執行任何運行時間需求,並取消背景工作。

  5. 最後, SyncWithDeviceAsync 方法會使用 DeviceTriggerResultsStartSyncBackgroundTaskAsync 傳回的對象來判斷背景工作是否成功啟動。 switch 語句是用來檢查結果的來源 DeviceTriggerResults

  6. 前景應用程式將實作一個私有事件處理程序,以接收來自裝置背景任務的進度並更新應用程式的 UI。

  7. 前景應用程式會實作私 OnSyncWithDeviceCompleted 用事件處理程式,以在背景工作完成時處理從背景工作轉換到前景應用程式的轉換。

    1. 使用BackgroundTaskCompletedEventArgs物件的CheckResults方法,判斷背景工作是否擲回任何例外狀況。

    2. 前景應用程式會重新開啟裝置以供應用程式使用,現在背景工作已完成並更新UI以通知使用者。

  8. 前景應用程式會實作 UI 中的私用按鈕按兩下事件處理程式,以啟動和取消背景工作。

    1. 私用 Sync_Click 事件處理程式會呼叫 SyncWithDeviceAsync 上述步驟中所述的方法。

    2. 私人CancelSync_Click事件處理程式會呼叫私人CancelSyncWithDevice方法來取消背景任務。

  9. 私有 CancelSyncWithDevice 方法會取消註冊並取消任何作用中的裝置同步處理,便於使用 BackgroundTaskRegistration.Unregister 方法開啟裝置。