次の方法で共有


バックグラウンド タスクからセンサーとデバイスにアクセスする

DeviceUseTrigger を使用すると、フォアグラウンド アプリが中断されている場合でも、ユニバーサル Windows アプリはバックグラウンドでセンサーと周辺機器にアクセスできます。 たとえば、アプリの実行場所によっては、バックグラウンド タスクを使用して、デバイスや監視センサーとデータを同期できます。 バッテリ寿命を維持し、適切なユーザーの同意を得るために、 DeviceUseTrigger の使用は、このトピックで説明するポリシーの対象となります。

バックグラウンドでセンサーまたは周辺機器にアクセスするには、 DeviceUseTrigger を使用するバックグラウンド タスクを作成します。 PC でこれを行う方法を示す例については、 カスタム USB デバイスのサンプルを参照してください。 電話の例については、 バックグラウンド センサーのサンプルを参照してください。

Von Bedeutung

DeviceUseTrigger は、インプロセス バックグラウンド タスクでは使用できません。 このトピックの情報は、アウトプロセスで実行されるバックグラウンド タスクにのみ適用されます。

デバイスのバックグラウンド タスクの概要

アプリがユーザーに表示されなくなった場合、Windows はアプリを中断または終了して、メモリと CPU リソースを再利用します。 これにより、他のアプリをフォアグラウンドで実行でき、バッテリ消費を削減できます。 これが発生すると、バックグラウンド タスクの助けを借りずに、進行中のデータ イベントは失われます。 Windows にはバックグラウンド タスク トリガー DeviceUseTrigger が用意されており、アプリが中断されている場合でも、バックグラウンドでデバイスとセンサーに対して実行時間の長い同期と監視操作をバックグラウンドで安全に実行できます。 アプリのライフサイクルの詳細については、「 起動、再開、およびバックグラウンド タスク」を参照してください。 バックグラウンド タスクの詳細については、「バックグラウンド タスク でアプリをサポートする」を参照してください。

手記 ユニバーサル Windows アプリでは、デバイスをバックグラウンドで同期するには、ユーザーがアプリによるバックグラウンド同期を承認している必要があります。 デバイスは、アクティブな I/O を使用して PC に接続またはペアリングする必要があり、最大 10 分間のバックグラウンド アクティビティが許可されます。 ポリシーの適用の詳細については、このトピックの後半で説明します。

制限事項: 重要なデバイス操作

実行時間の長いファームウェアの更新など、一部の重要なデバイス操作は 、DeviceUseTrigger では実行できません。 このような操作は、PC でのみ実行でき、 DeviceServicingTrigger を使用する特権アプリでのみ実行できます。 特権アプリは、デバイスの製造元がこれらの操作の実行を承認したアプリです。 デバイス メタデータは、デバイスの特権アプリとして指定されているアプリ (存在する場合) を指定するために使用されます。 詳細については、「 Microsoft Store デバイス アプリのデバイスの同期と更新」を参照してください。

DeviceUseTrigger バックグラウンド タスクでサポートされるプロトコルやAPI

DeviceUseTrigger を使用するバックグラウンド タスクを使用すると、アプリは多くのプロトコル/API を介して通信できます。そのほとんどは、システムによってトリガーされるバックグラウンド タスクではサポートされていません。 ユニバーサル Windows アプリでは、次の機能がサポートされています。

プロトコル ユニバーサル Windows アプリのデバイスユーズトリガー
USB このプロトコルはサポートされています。
HID このプロトコルはサポートされています。
Bluetooth RFCOMM このプロトコルはサポートされています。
Bluetooth GATT このプロトコルはサポートされています。
メディア転送プロトコル (MTP) このプロトコルはサポートされています。
有線ネットワーク このプロトコルはサポートされています。
ネットワーク Wi-Fi このプロトコルはサポートされています。
IDeviceIOControl deviceservicingtrigger では ideviceiocontrol がサポートされます
センサーズAPI deviceservicingtrigger では、ユニバーサル センサー 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 を使用するには、次の基本的な手順に従います。 バックグラウンド タスクの詳細については、「バックグラウンド タスク でアプリをサポートする」を参照してください。

  1. アプリはバックグラウンド タスクをアプリ マニフェストに登録し、IBackgroundTask を実装する Windows ランタイム クラスまたは JavaScript アプリ用の専用 JavaScript ページにバックグラウンド タスク コードを埋め込みます。
  2. アプリが起動すると、 DeviceUseTrigger 型のトリガー オブジェクトが作成および構成され、後で使用するためにトリガー インスタンスが格納されます。
  3. アプリは、バックグラウンド タスクが以前に登録されているかどうかを確認し、登録されていない場合はトリガーに対して登録します。 アプリでは、このトリガーに関連付けられているタスクに条件を設定できないことに注意してください。
  4. アプリがバックグラウンド タスクをトリガーする必要がある場合は、まず RequestAccessAsync を呼び出して、アプリがバックグラウンド タスクを要求できるかどうかを確認する必要があります。
  5. アプリがバックグラウンド タスクを要求できる場合は、デバイス トリガー オブジェクトで RequestAsync アクティブ化メソッドを呼び出します。
  6. バックグラウンド タスクは、他のシステム バックグラウンド タスクと同様に調整されません (CPU 時間クォータはありません)、フォアグラウンド アプリの応答性を維持するために優先順位を下げながら実行されます。
  7. その後、Windows はトリガーの種類に基づいて、バックグラウンド タスクを開始する前に操作に対するユーザーの同意を要求するなど、必要なポリシーが満たされていることを検証します。
  8. Windows はシステム条件とタスク ランタイムを監視し、必要に応じて、必要な条件が満たされなくなった場合にタスクを取り消します。
  9. バックグラウンド タスクが進行状況または完了を報告すると、アプリは登録済みタスクの進行状況と完了したイベントを通じてこれらのイベントを受け取ります。

重要なDeviceUseTriggerを使用する場合は、次の重要な点を考慮してください。

  • DeviceUseTrigger を使用するバックグラウンド タスクをプログラムでトリガーする機能は、Windows 8.1 と Windows Phone 8.1 で初めて導入されました。

  • PC 上の周辺機器を更新するときにユーザーの同意を得るために、Windows によって特定のポリシーが適用されます。

  • 周辺機器の同期と更新時にユーザーのバッテリ寿命を維持するために、追加のポリシーが適用されます。

  • DeviceUseTrigger を使用するバックグラウンド タスクは、一定のポリシー要件が満たされなくなったときに、最大バックグラウンド時間 (ウォール クロック時間) を含め、Windows によって取り消される可能性があります。 これらのバックグラウンド タスクを使用して周辺機器と対話する場合は、これらのポリシー要件を考慮することが重要です。

ヒント これらのバックグラウンド タスクのしくみを確認するには、サンプルをダウンロードしてみてください。 PC でこれを行う方法を示す例については、 カスタム USB デバイスのサンプルを参照してください。 電話の例については、 バックグラウンド センサーのサンプルを参照してください。  

頻度とフォアグラウンドの制限

アプリが操作を開始できる頻度に制限はありませんが、アプリは一度に 1 つの DeviceUseTrigger バックグラウンド タスク操作のみを実行でき (これは他の種類のバックグラウンド タスクには影響しません)、アプリがフォアグラウンドにある間にのみバックグラウンド タスクを開始できます。 アプリがフォアグラウンドにないときは、デバイスユーズトリガーを使ってバックグラウンドタスクを開始できません。 最初のバックグラウンド タスクが完了する前に、アプリで 2 番目の DeviceUseTrigger バックグラウンド タスクを開始することはできません。

デバイスの制限

各アプリは 1 つの DeviceUseTrigger バックグラウンド タスクの登録と実行のみに制限されていますが、デバイス (アプリが実行されている) では、複数のアプリで DeviceUseTrigger バックグラウンド タスクを登録して実行できる場合があります。 デバイスによっては、すべてのアプリからの DeviceUseTrigger バックグラウンド タスクの合計数に制限がある場合があります。 これは、リソースに制約のあるデバイスのバッテリを維持するのに役立ちます。 詳細については、次の表を参照してください。

1 つの DeviceUseTrigger バックグラウンド タスクから、アプリは無制限の数の周辺機器またはセンサーにアクセスできます。これは、前の表に記載されているサポートされている API とプロトコルによってのみ制限されます。

バックグラウンド タスク ポリシー

アプリが DeviceUseTrigger バックグラウンド タスクを使用する場合、Windows によってポリシーが適用されます。 これらのポリシーが満たされていない場合は、バックグラウンド タスクが取り消される可能性があります。 この種のバックグラウンド タスクを使用してデバイスやセンサーを操作する場合は、これらのポリシー要件を考慮することが重要です。

タスク開始ポリシー

次の表は、ユニバーサル Windows アプリに適用されるタスク開始ポリシーを示しています。

ポリシー ユニバーサル Windows アプリのデバイスユーズトリガー
バックグラウンド タスクをトリガーすると、アプリがフォアグラウンドになります。 ポリシーが に適用されます
デバイスがシステムに接続されている (またはワイヤレス デバイスの範囲)。 ポリシーが に適用されます
デバイスは、サポートされているデバイス周辺機器 API (USB、HID、Bluetooth、センサーなどの Windows ランタイム API) を使用してアプリからアクセスできます。 アプリがデバイスまたはセンサーにアクセスできない場合、バックグラウンド タスクへのアクセスは拒否されます。 ポリシーが に適用されます
アプリによって提供されるバックグラウンド タスク エントリ ポイントは、アプリ パッケージ マニフェストに登録されます。 ポリシーが に適用されます
アプリごとに DeviceUseTrigger バックグラウンド タスクは 1 つだけ実行されています。 ポリシーが に適用されます
deviceUseTrigger バックグラウンド タスクの最大数にまだ達していない (アプリが実行されている) デバイス。 デスクトップ デバイス ファミリ: 登録して並列で実行できるタスクの数に制限はありません。 モバイル デバイス ファミリ: 512 MB デバイス上の 1 つのタスク。それ以外の場合は、2 つのタスクを登録して並列で実行できます。
サポートされている API/プロトコルを使用する場合に、アプリが 1 つの DeviceUseTrigger バックグラウンド タスクからアクセスできる周辺機器またはセンサーの最大数。 無制限
バックグラウンド タスクでは、画面がロックされている場合は 1 分ごとに、または画面がロックされていない場合は 5 分ごとに 400 ミリ秒の CPU 時間 (1 GHz CPU を想定) が消費されます。 このポリシーを満たしないと、タスクが取り消される可能性があります。 ポリシーが に適用されます

ランタイム ポリシーのチェック

Windows では、タスクがバックグラウンドで実行されている間、次のランタイム ポリシー要件が適用されます。 いずれかのランタイム要件が満たされなくなった場合、Windows はデバイスのバックグラウンド タスクをキャンセルします。

次の表は、ユニバーサル Windows アプリに適用されるランタイム ポリシーを示しています。

ポリシー チェック ユニバーサル Windows アプリのデバイスユーズトリガー
デバイスがシステムに接続されている (またはワイヤレス デバイスの範囲)。 ポリシーチェックがに適用される
タスクは、デバイスに対して通常の I/O を実行しています (5 秒ごとに 1 I/O)。 ポリシーチェックがに適用される
アプリはタスクを取り消していません。 ポリシーチェックがに適用される
壁時計の時間制限 – アプリのタスクをバックグラウンドで実行できる合計時間。 デスクトップ デバイス ファミリの: 10 分。 モバイル デバイス ファミリ: 時間制限なし。 リソースを節約するために、一度に実行できるタスクは 1 個または 2 個までです。
アプリが終了していません。 ポリシーチェックがに適用される

ベスト プラクティス

DeviceUseTrigger バックグラウンド タスクを使用するアプリのベスト プラクティスを次に示します。

バックグラウンド タスクのプログラミング

アプリから DeviceUseTrigger バックグラウンド タスクを使用すると、ユーザーがアプリを切り替え、フォアグラウンド アプリが Windows によって中断された場合でも、フォアグラウンド アプリから開始された同期操作または監視操作がバックグラウンドで引き続き実行されます。 バックグラウンド タスクを登録、トリガー、登録解除するには、この全体的なモデルに従うことをお勧めします。

  1. RequestAccessAsync を呼び出して、アプリがバックグラウンド タスクを要求できるかどうかを確認します。 これは、バックグラウンド タスクを登録する前に行う必要があります。

  2. トリガーを要求する前に、バックグラウンド タスクを登録します。

  3. 進行状況と完了イベント ハンドラーをトリガーに接続します。 アプリが中断から戻ると、Windows は、バックグラウンド タスクの状態を判断するために使用できる、キューに置かれた進行状況または完了イベントをアプリに提供します。

  4. DeviceUseTrigger バックグラウンド タスクをトリガーするときに、開いているデバイスまたはセンサー オブジェクトを閉じて、それらのデバイスまたはセンサーをバックグラウンド タスクで自由に開いて使用できるようにします。

  5. トリガーを登録します。

  6. バックグラウンド タスクからデバイスまたはセナーにアクセスする場合のバッテリへの影響を慎重に検討してください。 たとえば、センサーのレポート間隔を頻繁に実行すると、タスクが頻繁に実行され、電話のバッテリーがすぐに消費される可能性があります。

  7. バックグラウンド タスクが完了したら、登録を解除します。

  8. バックグラウンドタスククラスのキャンセルイベントに対応するように登録します。 取り消しイベントに登録すると、Windows またはフォアグラウンド アプリによって取り消されたときに、バックグラウンド タスク コードで実行中のバックグラウンド タスクをクリーンに停止できます。

  9. アプリの終了時 (中断ではなく) に、実行中のタスクが不要になった場合は登録を解除して取り消します。 メモリの少ない電話などのリソースに制約のあるシステムでは、他のアプリで DeviceUseTrigger バックグラウンド タスクを使用できるようになります。

    • アプリが終了したら、実行中のタスクの登録を解除して取り消します。

    • アプリが終了すると、バックグラウンド タスクが取り消され、既存のイベント ハンドラーが既存のバックグラウンド タスクから切断されます。 これにより、バックグラウンド タスクの状態を判断できなくなります。 バックグラウンド タスクの登録を解除して取り消すと、キャンセル コードでバックグラウンド タスクをクリーンに停止できます。

バックグラウンド タスクの取り消し

フォアグラウンド アプリからバックグラウンドで実行されているタスクを取り消すには、アプリで使用する BackgroundTaskRegistration オブジェクトの Unregister メソッドを使用して DeviceUseTrigger バックグラウンド タスクを登録します。 BackgroundTaskRegistration で Unregister メソッドを使用してバックグラウンド タスクの登録を解除すると、バックグラウンド タスク インフラストラクチャによってバックグラウンド タスクが取り消されます。

さらに 、Unregister メソッドはブール値 true または false 値を受け取り、バックグラウンド タスクの現在実行中のインスタンスを終了せずに取り消す必要があるかどうかを示します。 詳細については、「 登録解除」の API リファレンスを参照してください。

の登録解除に加えて、アプリは BackgroundTaskDeferral.Completeを呼び出す必要もあります。 これにより、バックグラウンド タスクに関連付けられている非同期操作が完了したことがシステムに通知されます。