Windows 8.1 におけるデバイス バックグラウンド タスクの作成 (UWP デバイス アプリ)
Windows 8.1 では、UWP アプリを使って周辺機器上でデータを同期できます。 アプリがデバイス メタデータに関連付けられている場合、その UWP デバイス アプリは、ファームウェア更新などのデバイス更新を実行することもできます。 このトピックでは、DeviceUseTrigger または DeviceServicingTrigger を使用するデバイス バックグラウンド タスクを作成する方法について説明します。 これらのトリガーを使用するデバイス バックグラウンド エージェントには、ユーザーの同意を確保したり、デバイスの同期時と更新時にバッテリ寿命の維持に役立ったりするポリシーが適用されます。 デバイス バックグラウンド タスクの詳細については、「UWP デバイス アプリのデバイスの同期と更新」を参照してください。
Note
このトピックは、カスタム USB デバイスのサンプルに対応しています。 カスタム USB デバイスのサンプルは、DeviceUseTrigger とのデバイス同期を実行するバックグラウンド タスクを示します。
カスタム USB デバイスのサンプルのデバイス バックグラウンド タスクには DeviceUseTrigger が用意されていますが、このトピックで説明する内容はすべて、DeviceServicingTrigger を使用するデバイス バックグラウンド タスクにも適用できます。 2 つのトリガーを使用する際の唯一の違いは、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
メソッドを呼び出し、バックグラウンド タスクが正常に開始されたかどうかを判断するために使用したDeviceTriggerResults
からRequestAsync
オブジェクトを返します。重要
Windows は、必要なタスク開始ポリシー確認がすべて完了していることを確認します。 すべてのポリシー確認が完了すると、更新操作がフォアグラウンド アプリの外部でバックグラウンド タスクとして実行され、操作の進行中にアプリを安全に中断できるようになります。 Windows はランタイム要件も適用し、それらの要件が満たされなくなった場合はバックグラウンド タスクを取り消します。
最後に、
SyncWithDeviceAsync
メソッドはDeviceTriggerResults
から返されたStartSyncBackgroundTaskAsync
オブジェクトを使用して、バックグラウンド タスクが正常に開始されたかどうかを判断します。 switch ステートメントは、DeviceTriggerResults
からの結果を検査するために使用されます。フォアグラウンド アプリは、デバイスのバックグラウンド タスクからの進行状況をアプリ UI に反映して更新するプライベート
OnSyncWithDeviceProgress
イベント ハンドラーを実装します。フォアグラウンド アプリは、バックグラウンド タスクが完了したときに、バックグラウンド タスクからフォアグラウンド アプリへの移行を処理するプライベート
OnSyncWithDeviceCompleted
イベント ハンドラーを実装します。CheckResults
オブジェクトのBackgroundTaskCompletedEventArgs
メソッドを使用して、バックグラウンド タスクによって例外がスローされたかどうかを判断します。フォアグラウンド アプリは、バックグラウンド タスクが完了すると、アプリで使用できるようにデバイスを再度開き、UI を更新してユーザーに通知します。
フォアグラウンド アプリは、UI からプライベート ボタン クリック イベント ハンドラーを実装して、バックグラウンド タスクを開始および取り消します。
プライベート
Sync_Click
イベント ハンドラーは、前の手順で説明したSyncWithDeviceAsync
メソッドを呼び出します。プライベート
CancelSync_Click
イベント ハンドラーは、プライベートCancelSyncWithDevice
メソッドを呼び出してバックグラウンド タスクを取り消します。
プライベート
CancelSyncWithDevice
メソッドは、BackgroundTaskRegistration.Unregister メソッドを使用してデバイスを再度開くことができるように、アクティブなデバイスの同期を登録解除して取り消します。