バックグラウンド処理ガイド

Android アプリがバックグラウンドでデータを処理することは、ユーザーにとって応答性のよい、かつ Android プラットフォームとって善良に振る舞うアプリを作成するうえで重要なポイントです。このガイドでは、バックグラウンド タスクのカテゴリを定義し、タスクを分類するための基準と、タスクの実行に使用する推奨 API を紹介します。

基本原則

一般に、数ミリ秒以上かかるタスクはすべて、バックグラウンド スレッドに委任する必要があります。長時間実行される一般的なタスクには、ビットマップのデコード、ストレージへのアクセス、機械学習(ML)モデルの操作、ネットワークへのリクエストなどがあります。

バックグラウンド タスクのカテゴリ

バックグラウンド タスクは、以下のメインカテゴリのいずれかに分類されます。

  • 即時
  • 延期
  • 定刻

タスクを分類するには、以下の質問に答えて、図 1 の対応する決定ツリーを最後までたどります。

ユーザーがアプリを操作している間に、タスクを完了する必要がありますか?
「はい」の場合、このタスクは「即時」に分類する必要があります。「いいえ」の場合は、2 つ目の質問に進みます。
タスクは正確な時間どおりに実行する必要がありますか?
タスクを定刻どおりに実行する必要がある場合は、タスクを「定刻」に分類します。

定刻どおりの実行が必要なタスクはほとんどありません。タスクが実行される時間は通常、ネットワークの可用性や電池残量などの条件に基づいて、小幅な変動を許容します。定刻に実行する必要のないタスクは、「延期」として分類する必要があります。

この決定ツリーを使って、バックグラウンド タスクの最適なカテゴリを判断する。
図 1. この決定ツリーを使って、バックグラウンド タスクの最適なカテゴリを判断する

以下のセクションで、バックグラウンド タスクの種類ごとにおすすめのソリューションについて説明します。

ユーザーが特定のスコープから出たときや、操作を終了したときに、終了する必要のあるタスクには、Kotlin コルーチンを使用することをおすすめします。Android KTX ライブラリの多くは、ViewModel のような一般的なアプリ コンポーネントや一般的なアプリのライフサイクルのために、すぐに使用できるコルーチン スコープを備えています。

Java プログラミング言語を使用する場合は、推奨オプションについて、Android でのスレッド化の説明をご覧ください。

ユーザーがアプリをバックグラウンドに移行したり、デバイスが再起動したりしても、直ちに実行して処理を続行する必要があるタスクの場合、WorkManager とその長時間実行タスクのサポートを使用することをおすすめします。

メディアの再生やアクティブなナビゲーションなどの特定のケースでは、フォアグラウンド サービスを直接使用することをおすすめします。

延期タスク

ユーザー操作に直接つながっておらず、今後いつでも実行できるタスクはすべて延期できます。延期タスクの場合におすすめのソリューションは WorkManager です。

WorkManager を使用すると、アプリが終了した場合やデバイスが再起動した場合でも、実行する予定の延期可能な非同期タスクのスケジュールを簡単に設定できます。このようなタスクのスケジュールを設定する方法については、WorkManager のドキュメントをご覧ください。

定刻タスク

正確な時間どおりに実行する必要があるタスクには、AlarmManager を使用できます。

AlarmManager について詳しくは、反復アラームのスケジュール設定をご覧ください。