はじめに
UWPには、アプリをBackgroundで実行するためのバックグラウンドタスクが用意されています。 まずは、以下の動画をご覧ください。BackgroundでMusicを再生しながら、Reseach Modeを呼んでいる様子です。 (ソースコードはMicrosoftのWindows-universal-samplesを利用しています。 https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/BackgroundMediaPlayback)
(また、ResearchModeのアプリは@akihiroさんのブログ(http://akihiro-document.azurewebsites.net/post/hololens_researchmode2/)の UWP(C#)版を利用しています。)
バックグラウンドタスクの二種類のプロセス
さて、ここでバックグラウンドタスクにおける二種類のプロセスがあるそうです。 この二つのプロセスについて、まとめてみました。 (参考 : バックグラウンド タスクのガイドライン - UWP app developer | Microsoft Docs )
A. インプロセス
アプリとそのバックグラウンド プロセスが同じプロセスで実行されるプロセス。
今回のBackgroundMediaPlayer Sampleはこちらのプロセスを利用しています。
[利点]
インプロセス バックグラウンド タスクでは、プロセス間通信が不要のため、記述内容は複雑になりません。
[欠点]
インプロセス バックグラウンド タスクでは、DeviceUseTrigger、DeviceServicingTrigger、IoTStartupTask の各トリガーがサポートされていません。
(→センサ系のトリガーが使えない)
また、アプリケーション内での VoIP バックグラウンド タスクのアクティブ化がサポートされていません。(→VoIPはアウトプロセス)
[特徴]
Application オブジェクトから EnteredBackground と LeavingBackground という 2 つの新しいイベントを使用できます。
EnteredBackground イベントは、アプリがバックグラウンドで実行されている間に処理されるコードを実行します。また、LeavingBackground イベントは、アプリがフォアグラウンドに移動したことを知るために処理します。
(シンプルに実装できる。)
B. アウトプロセス
[利点]
アウトプロセスタスクでのコードがクラッシュしても、フォアグラウンドでのコードはクラッシュしません。また、 DeviceUseTrigger、DeviceServicingTrigger、IoTStartupTask の各トリガーを使用できます。
[欠点]
プロセス間通信を利用するため、記述内容が複雑になりがちです
[特徴(というより、書くべき処理)]
- IBackgroundTask インターフェイスを実装するクラスを作ると、コードをバックグラウンドで実行できます。 このコードは、SystemTrigger や MaintenanceTrigger などを使って特定のイベントをトリガーすると実行されます。
- 実行するバックグラウンド タスクを登録します
- イベント ハンドラーでバックグラウンド タスクの完了を処理します
- アプリがバックグラウンド タスクを使うことをアプリ マニフェストで宣言します
(工程が多く複雑(?)。)
やりたいこと
- カメラセンサ情報 + Networkをbackgroundで実行、サーバー側にセンサ情報を投げ続ける。 この場合、アウトプロセスを利用する必要があると考えます。
まとめ
アプリをBackgroundで実行する様子と、そのために用意されたバックグラウンドタスクにおける二つのプロセスについてまとめました。 今回は公式ドキュメントの中で用意された二つのプロセスについて着目しましたが、実装面には触れていません。 Backgroundで何を処理させたいかで、どちらのプロセスを選択すべきかが変わる、といったところでしょうか。 今後は、Hololensのカメラセンサ等をBackgroundで処理していこうと思います。