バックグラウンド タスクからのセンサーやデバイスへのアクセス

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

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

重要

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

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

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

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

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

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

DeviceUseTrigger バックグラウンド タスクでサポートされる Protocols/API

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

Protocol ユニバーサル Windows アプリの DeviceUseTrigger
USB このプロトコルはサポートされています。
HID このプロトコルはサポートされています。
Bluetooth RFCOMM このプロトコルはサポートされています。
Bluetooth GATT このプロトコルはサポートされています。
MTP このプロトコルはサポートされています。
ワイヤード (有線) ネットワーク このプロトコルはサポートされています。
ネットワーク Wi-Fi このプロトコルはサポートされています。
IDeviceIOControl deviceservicingtrigger では ideviceiocontrol がサポートされます
Sensors API deviceservicingtrigger では、ユニバーサル センサー API がサポートされます ( ユニバーサル デバイス ファミリ内のセンサーに制限されます)

アプリ パッケージ マニフェストでのバックグラウンド タスクの登録

アプリは、バックグラウンド タスクの一部として実行されるコードで同期操作と更新操作を実行します。 このコードは、IBackgroundTask (または JavaScript アプリ用の専用 JavaScript ページ) を実装するWindows ランタイム クラスに埋め込まれています。 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 でこれを行う方法を示す例については、 Custom USB デバイスのサンプルを参照してください。 電話での例については、 バックグラウンド センサーのサンプルを参照してください。  

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

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

デバイスの制限

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

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

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

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

タスク開始に関するポリシー

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

ポリシー ユニバーサル Windows アプリの DeviceUseTrigger
バックグラウンド タスクをトリガーすると、アプリがフォアグラウンドになります。 ポリシーが適用されます
デバイスがシステムに接続されている (またはワイヤレス デバイスの範囲)。 ポリシーが適用されます
デバイスは、サポートされているデバイス周辺機器 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 アプリの DeviceUseTrigger
デバイスがシステムに接続されている (またはワイヤレス デバイスの範囲)。 ポリシー チェックが適用されます
タスクは、デバイスに対して通常の 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 バックグラウンド タスクを登録します。 BackgroundTaskRegistrationUnregister メソッドを使用してバックグラウンド タスクの登録を解除すると、バックグラウンド タスク インフラストラクチャによってバックグラウンド タスクが取り消されます。

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

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