バックグラウンド タスクによるアプリのサポート
このセクションの各トピックでは、トリガーに対応して軽量コードをバックグラウンドで実行する方法について説明します。 バックグラウンド タスクを使えば、アプリが中断されている、または実行されていないときに機能を提供できます。 また、VOIP、メール、IM などのリアルタイム通信アプリにバックグラウンド タスクを使うこともできます。
バックグラウンドでのメディア再生
Windows 10 バージョン 1607 以降では、バックグラウンドでのオーディオ再生がより簡単になりました。 詳しくは、「バックグラウンドでのメディアの再生」をご覧ください。
インプロセスとアウトプロセスのバックグラウンド タスク
バックグラウンド タスクを実装するにあたっては、2 つのアプローチがあります。
- インプロセス: アプリとそのバックグラウンド プロセスが同じプロセスで実行されます。
- アウトプロセス: アプリとバックグラウンド プロセスが個別のプロセスで実行されます。
インプロセス バックグラウンドのサポートは、バックグラウンド タスクの書き込みを簡略化するために、Windows 10 バージョン 1607 で導入されました。 ただし現在でも、アウトプロセスのバックグラウンド タスクを書き込むことはできます。 インプロセスのバックグラウンド タスクとアウトプロセスのバックグラウンド タスクの使い分けに関する推奨事項については、「バックグラウンド タスクのガイドライン」をご覧ください。
アウトプロセスのバックグラウンド タスクを使用すると、問題が発生した際にバックグラウンド プロセスによってアプリのプロセスがダウンすることがないので、より回復性が高くなります。 ただし、回復性が高くなる代わりに、アプリとバックグラウンド タスクの間のプロセス間通信の管理がより複雑になります。
アウトプロセスのバックグラウンド タスクは、OS が個別のプロセス (backgroundtaskhost.exe) 内で実行する、IBackgroundTask インターフェイスを実装した軽量クラスとして実装されます。 バックグラウンド タスクは BackgroundTaskBuilder クラスを使用して登録します。 このクラス名は、バックグラウンド タスクの登録時にエントリ ポイントとして指定するために使われます。
Windows 10 バージョン 1607 では、バックグラウンド タスクを作成しなくても、バックグラウンド アクティビティを有効にできます。 フォアグラウンド アプリケーションのプロセス内で、バックグラウンド コードを直接実行できます。
インプロセス バックグラウンド タスクの概要については、「インプロセス バックグラウンド タスクの作成と登録」をご覧ください。
アウトプロセス バックグラウンド タスクの概要については、「アウトプロセス バックグラウンド タスクの作成と登録」をご覧ください。
ヒント
Windows 10 以降では、バックグラウンド タスクを登録するための前提要件として、アプリをロック画面に配置する必要がなくなりました。
システム イベントに対するバックグラウンド タスク
アプリでは、SystemTrigger クラスを使ってバックグラウンド タスクを登録することにより、システムで生成されたイベントに応答することができます。 アプリは、次のシステム イベント トリガー (SystemTriggerType で定義されている) を使うことができます。
トリガー名 | 説明 |
---|---|
InternetAvailable | インターネットが利用可能になります。 |
NetworkStateChange | コストや接続の変更などネットワークの変更が行われます。 |
OnlineIdConnectedStateChange | アカウントに関連付けられたオンライン ID が変更されます。 |
SmsReceived | インストールされたモバイル ブロードバンド デバイスにより、新しい SMS メッセージが受け取られます。 |
TimeZoneChange | デバイスでタイム ゾーンが変更されます (たとえば、システムが夏時間に合わせて時刻を調整したとき)。 |
詳しくは、「バックグラウンド タスクによるシステム イベントへの応答」をご覧ください。
バックグラウンド タスクの条件
条件を追加すると、バックグラウンド タスクがトリガーされた後でも、バックグラウンド タスクを実行するタイミングを制御することができます。 バックグラウンド タスクは、トリガーされても、条件がすべて満たされるまで実行されません。 次の条件 (SystemConditionType 列挙型で表されます) を使うことができます。
[条件名] | 説明 |
---|---|
InternetAvailable | インターネットが利用可能である必要があります。 |
InternetNotAvailable | インターネットが利用不可である必要があります。 |
SessionConnected | セッションが接続されている必要があります。 |
SessionDisconnected | セッションが切断されている必要があります。 |
UserNotPresent | ユーザーが不在である必要があります。 |
UserPresent | ユーザーが在席している必要があります。 |
バックグラウンド タスク BackgroundTaskBuilder.AddCondition に InternetAvailable 条件を追加して、ネットワーク スタックが実行されるまで、バックグラウンド タスクのトリガーを遅らせます。 この条件では、ネットワークが利用可能になるまでバックグラウンド タスクが実行されないため、電力が節約されます。 この条件では、リアルタイムのアクティブ化は行われません。
バックグラウンド タスクでネットワーク接続が必要である場合は、IsNetworkRequested を設定すると、バックグラウンド タスクが実行されている間、ネットワークは稼働状態のままになります。 これによって、デバイスがコネクト スタンバイ モードに入っている場合でも、タスクの実行中はネットワークを稼働状態に保つようにバックグラウンド タスク インフラストラクチャに指示されます。 バックグラウンド タスクで IsNetworkRequested が設定されていない場合、バックグラウンド タスクはコネクト スタンバイ モード (電話の画面がオフになっている場合など) にネットワークにアクセスできなくなります。 バックグラウンド タスクの条件について詳しくは、「バックグラウンド タスクを実行するための条件の設定」をご覧ください。
アプリケーション マニフェストの要件
アウトプロセスを実行するバックグラウンド タスクをアプリに正常に登録するには、バックグラウンド タスクをアプリケーション マニフェストで宣言する必要があります。 ホスト アプリと同じプロセスで実行されるバックグラウンド タスクについては、アプリケーション マニフェストで宣言する必要はありません。 詳しくは、「アプリケーション マニフェストでのバックグラウンド タスクの宣言」をご覧ください。
バックグラウンド タスク
次のリアルタイム トリガーを使うと、バックグラウンドで軽量なカスタム コードを実行できます。
リアルタイム トリガー | 説明 |
---|---|
コントロール チャネル | バックグラウンド タスクでは、ControlChannelTrigger を使って接続が有効な状態を維持し、コントロール チャネルでメッセージを受け取ることができます。 アプリがソケットをリッスンしている場合は、ControlChannelTrigger の代わりにソケット ブローカーを使うことができます。 ソケット ブローカーの使用について詳しくは、「SocketActivityTrigger」をご覧ください。 ControlChannelTrigger は、Windows Phone ではサポートされていません。 |
Timer | バックグラウンド タスクは、15 分おきに実行できます。また、TimeTrigger を使って特定の時刻に実行するように設定することもできます。 詳しくは、「タイマーでのバックグラウンド タスクの実行」をご覧ください。 |
プッシュ通知 | バックグラウンド タスクは、PushNotificationTrigger に応答して、直接プッシュ通知を受け取ります。 |
注
ユニバーサル Windows アプリは、どの種類のバックグラウンド トリガーを登録する場合でも、先に RequestAccessAsync を呼び出す必要があります。
更新プログラムのリリース後にユニバーサル Windows アプリが引き続き適切に実行されるようにするには、更新後にアプリが起動する際に、RemoveAccess、RequestAccessAsync の順に呼び出します。 詳しくは、「バックグラウンド タスクのガイドライン」をご覧ください。
トリガー インスタンスの数の制限: アプリが登録できる一部のトリガー インスタンスの数には制限があります。 アプリによって ApplicationTrigger、MediaProcessingTrigger、DeviceUseTrigger を登録できるのは、アプリのインスタンスごとに 1 回のみです。 アプリでこの制限を超えると、登録で例外がスローされます。
システム イベント トリガー
SystemTriggerType 列挙体は、次のシステム イベント トリガーを表します。
トリガー名 | 説明 |
---|---|
UserPresent | ユーザーが在席になったら、バックグラウンド タスクがトリガーされます。 |
UserAway | ユーザーが不在になったら、バックグラウンド タスクがトリガーされます。 |
ControlChannelReset | コントロール チャネルがリセットされたら、バックグラウンド タスクがトリガーされます。 |
SessionConnected | セッションが接続されたら、バックグラウンド タスクがトリガーされます。 |
以下のシステム イベント トリガーは、ユーザーがアプリをロック画面に配置した場合や、アプリをロック画面から削除した場合に、そのことを通知します。
トリガー名 | 説明 |
---|---|
LockScreenApplicationAdded | アプリのタイルがロック画面に追加されます。 |
LockScreenApplicationRemoved | アプリのタイルがロック画面から削除されます。 |
バックグラウンド タスク リソースの制限
バックグラウンド タスクは軽量です。 バックグラウンドの実行を最小限に抑えることにより、フォアグラウンド アプリでの最適なユーザー エクスペリエンスとバッテリ寿命が保証されます。 この設定は、リソース制約をバックグラウンド タスクに適用することにより、強制的に適用されます。
バックグラウンド タスクに使用できる時間は、ウォールクロック時間で 30 秒間に制限されています。
メモリの制限
リソースには制約があるため (特にメモリの少ないデバイスの場合)、バックグラウンド タスクにはメモリの制限が存在する場合があり、これによってバックグラウンド タスクが使うことができるメモリの最大容量が決まります。 バックグラウンド タスクがこの制限を超過する操作を試行すると、操作は失敗し、タスクで処理できるメモリ不足例外が生成されることがあります。 メモリ不足例外がタスクで処理されない場合や、試行された操作がメモリ不足例外を生じさせる性質のものではなかった場合は、タスクが直ちに終了されます。
上限 (あれば) を検出し、進行中のバックグラウンド タスクのメモリ使用量を監視するには、MemoryManager API を使って、現在のメモリ使用量と制限を問い合わせることができます。
メモリの少ないデバイスにおけるバックグラウンド タスクのあるアプリのデバイスごとの制限
メモリに制約のあるデバイスでは、デバイスにインストールでき、いつでもバックグラウンド タスクを使うことができるアプリの数に制限があります。 この数を超えると、すべてのバックグラウンド タスクを登録するのに必要な RequestAccessAsync の呼び出しが失敗します。
バッテリー節約機能
バッテリー節約機能が有効であってもバックグラウンド タスクを実行しプッシュ通知を受信するようにアプリを設定していない限り、デバイスが外部電源に接続されていない状態でバッテリー残量が指定量を下回ると、バッテリー節約機能 (有効な場合) によりバックグラウンド タスクが実行されなくなります。 これによりバックグラウンド タスクを登録できなくなることはありません。
ただし、エンタープライズ アプリと、Microsoft Store で公開されないアプリについて、バックグラウンド タスクまたは延長実行セッションをバックグラウンドで無期限に実行する機能を使用する方法について学習するには、「バックグラウンドで無期限に実行する」を参照してください。
リアルタイム通信に対するバックグラウンド タスク リソース保証
リソース クォータがリアルタイム通信機能に干渉することがないように、ControlChannelTrigger と PushNotificationTrigger を使ったバックグラウンド タスクごとに CPU リソース保証クォータが確保されます。 リソース クォータは、先ほど説明したように、これらのバックグラウンド タスクに対して一定のままです。
アプリでは、特に何も行わなくても、ControlChannelTrigger と PushNotificationTrigger を使ったバックグラウンド タスクごとにリソース保証クォータが確保されます。 システムは、これらのタスクを常に重要なバックグラウンド タスクとして扱います。
メンテナンス トリガー
メンテナンス タスクは、デバイスが AC 電源に接続されているときにだけ実行されます。 詳しくは、「メンテナンス トリガーの使用」をご覧ください。
センサーとデバイスのバックグラウンド タスク
アプリでは、DeviceUseTrigger クラスによりバックグラウンド タスクからセンサーと周辺デバイスにアクセスできます。 このトリガーは、データの同期や監視など長期間にわたる操作に使用できます。 システム イベントのタスクとは異なり、DeviceUseTrigger タスクは、アプリがフォアグラウンドで実行されており条件が設定されていない場合にのみトリガーできます。
重要
DeviceUseTrigger と DeviceServicingTrigger は、インプロセスのバックグラウンド タスクでは使用できません。
時間がかかるファームウェア更新など、一部の重要なデバイス操作は、DeviceUseTrigger では実行できません。 このような操作は PC でのみ、DeviceServicingTrigger を使う特権アプリによってのみ実行できます。 特権アプリとは、これらの操作を実行する権限をデバイス製造元から与えられているアプリです。 デバイス メタデータを使って、どのアプリがデバイスの特権アプリであるか (存在する場合) を指定します。 詳細については、Microsoft Store デバイス アプリのデバイスの同期および更新に関するページを参照してください
バックグラウンド タスクの管理
バックグラウンド タスクは、イベントとローカル ストレージを使って進行状況、完了、キャンセルをアプリに報告できます。 アプリは、バックグラウンド タスクがスローした例外をキャッチしたり、アプリの更新中にバックグラウンド タスクの登録を行うこともできます。 詳細については、
取り消されたバックグラウンド タスクの処理
バックグラウンド タスクの進捗状況と完了の監視
アプリの起動中に、バックグラウンド タスクの登録を確認します。 アプリのグループ化されていないバックグラウンド タスクが BackgroundTaskBuilder.AllTasks に存在することを確認します。 存在しないものを再登録します。 不要になったタスクの登録を解除します。 これにより、アプリを起動するたびに、すべてのバックグラウンド タスクの登録が最新の状態になります。
関連トピック
Windows 10 におけるマルチタスクの概念的ガイダンス
関連するバックグラウンド タスクのガイダンス
- バックグラウンド タスクのガイドライン
- バックグラウンド タスクからのセンサーやデバイスへのアクセス
- インプロセス バックグラウンド タスクの作成と登録
- アウトプロセス バックグラウンド タスクの作成と登録
- アウトプロセスのバックグラウンド タスクをインプロセスのバックグラウンド タスクへ変換
- バックグラウンド タスクのデバッグ
- アプリケーション マニフェストでのバックグラウンド タスクの宣言
- バックグラウンド タスクの登録のグループ化
- 取り消されたバックグラウンド タスクの処理
- UWP アプリで一時停止イベント、再開イベント、バックグラウンド イベントをトリガーする方法 (デバッグ時)
- バックグラウンド タスクの進捗状況と完了の監視
- バックグラウンドでのメディアの再生
- バックグラウンド タスクの登録
- バックグラウンド タスクによるシステム イベントへの応答
- タイマーでのバックグラウンド タスクの実行
- UWP アプリが更新された際のバックグラウンド タスクの実行
- バックグラウンドで無期限に実行する
- バックグラウンド タスクを実行するための条件の設定
- アプリ内からのバックグラウンド タスクのトリガー
- バックグラウンド タスクのライブ タイルの更新
- メンテナンス トリガーの使用