サービスは、音楽の再生、データの同期、進行中のファイル転送など、独自のユーザーインターフェイスを持たずに作業を実行できる Android のコンポーネントです。アクティビティ、ブロードキャストレシーバー、コンテンツプロバイダーとともに、サービスは Android の四つの基本的なアプリのコンポーネントの一つであり、ほかと同様にアプリの AndroidManifest.xml に登録されなければなりません。既定では、サービスはアプリのメインスレッドで動作するため、重い作業は引き続きバックグラウンドのスレッドに移さなければなりません。
Android は、停止されるまでタスクを実行する開始されたサービスと、ほかのコンポーネントがバインドして通信できるバインドされたサービスを区別します。フォアグラウンドサービスはユーザーが認識している作業を実行し、常時表示の通知を表示しなければなりません。バックグラウンドの作業はバッテリーの持ちとパフォーマンスに影響するため、Android はアプリがバックグラウンドでサービスを開始できるタイミングに段階的に制限を導入してきており、延期できる作業には Google は通常、代わりに WorkManager を推奨しています。
Android のサービスは、音楽の再生、同期、ファイル転送など、独自のユーザーインターフェイスなしで作業を実行するアプリのコンポーネントです。タスクを実行するために開始することも、通信したいほかのコンポーネントからバインドされることもできます。フォアグラウンドサービスは、作業が行われていることをユーザーが知るように常時表示の通知を表示し、Android のバックグラウンドの作業に対する制限のため、延期できるタスクには WorkManager がよく使われます。
More about サービス
サービスは、アクティビティ、ブロードキャストレシーバー、コンテンツプロバイダーとともに、Android のアプリの四つの基本的なコンポーネントの一つです。アクティビティはユーザーが操作する画面を表示します。一方、サービスはユーザーインターフェイスを必要としない作業や、ユーザーが画面を離れても続けなければならない作業に使われます。典型的な例は、音楽やポッドキャストの再生、ナビゲーション、ファイルのアップロード、サーバーとのデータの同期です。
技術的には、サービスは android.app.Service を継承し、AndroidManifest.xml に service 要素で登録されるクラスです。システムは、onCreate()、onStartCommand()、onBind()、onDestroy() などのメソッドを通じてサービスのライフサイクルを制御します。サービスは自動的に別のスレッドで動作するわけではないことを知っておくことが重要です。既定では、そのコードはアプリのメインスレッドで実行されるため、アプリが応答しなくなるのを防ぐために、長時間の作業やブロックする作業は、たとえば Kotlin のコルーチンを使ってバックグラウンドのスレッドに移さなければなりません。
サービスはさまざまな方法で使え、それぞれが異なるニーズに適しています。
フォアグラウンドサービス:音楽の再生や進行中のワークアウトの記録など、ユーザーが認識している作業を実行します。フォアグラウンドサービスは常時表示の通知を表示しなければならず、より新しい Android のバージョンでは、アプリはサービスの種類を宣言し、関連する権限を持たなければなりません。
バックグラウンドサービス:ユーザーが直接見ない作業を実行します。Android 8.0 以降、アプリ自体がバックグラウンドにあるときにそのようなサービスを開始できるタイミングには、厳しい制限があります。
バインドされたサービス:ほかのアプリのものを含むほかのコンポーネントがサービスにバインドし、要求を送り、応答を受け取れるクライアントサーバー型のインターフェイスを提供します。バインドされたサービスは、少なくとも一つのコンポーネントがバインドしている間だけ存続します。
サービスの最大の強みの一つは、アプリが特定の画面に縛られずに重要な作業を続けられることです。同時に、バックグラウンドの作業はバッテリー、メモリ、データを使うため、注意が必要です。そのため、Android はバックグラウンドの作業を制限するルールを段階的に導入してきており、ユーザーはフォアグラウンドサービスを実行しているアプリを確認し停止できます。
多くのタスクについて、Google は代わりに Android Jetpack の一部である WorkManager を推奨しています。WorkManager は、アプリが閉じられたりデバイスが再起動されたりしても確実に実行されなければならず、延期できる作業、たとえばログファイルのアップロードや定期的な同期を対象としています。WorkManager はシステムの制限を考慮し、ネットワーク接続や充電などの条件で構成できます。
まとめると、サービスは、ユーザーが続くことを期待する進行中の作業をアプリが実行する必要があるとき、またはほかのコンポーネントが長時間動作するプロセスと通信する必要があるときに適した選択です。適切な種類のサービス、または作業を延期できる場合は WorkManager を選ぶことで、開発者は機能的でデバイスのリソースにやさしいアプリを構築できます。
Frequently asked questions about サービス
Android におけるサービスとは何ですか?
サービスは、独自のユーザーインターフェイスを持たずにバックグラウンドで作業を実行する Android のコンポーネントです。音楽の再生、進行中のナビゲーション、ファイルのアップロードなど、ユーザーがアプリを見ていないときにも続ける必要があるタスクに使われます。
サービスは AndroidManifest.xml ファイルで宣言されなければなりません。既定では、サービスはアプリのメインスレッドで動作することを知っておくことが重要です。そのため、重いタスクは引き続きバックグラウンドのスレッドやコルーチンに移さなければなりません。より新しい Android のバージョンでは、バッテリーを節約するために、アプリがバックグラウンドで動作できるタイミングについての厳しいルールもあります。
Android にはどのような種類のサービスがあるのですか?
Android は三つの種類のサービスを区別します。フォアグラウンドサービスはユーザーが認識しているタスクを実行し、動作している間は通知を表示しなければなりません。たとえば、音楽の再生やランニングの記録に使われます。
バックグラウンドサービスは、ユーザーが直接見ない作業を実行します。Android 8.0 以降、アプリがそのようなサービスを開始できるタイミングには厳しい制限があり、多くのタスクには代わりに WorkManager が推奨されます。バインドされたサービスにより、アクティビティなどのほかのコンポーネントがそれにバインドして通信でき、何かがバインドしている間だけ動作します。
開始されたサービスとバインドされたサービスの違いは何ですか?
開始されたサービスは startService または startForegroundService で開始され、自身を停止するか停止されるまで動作します。通常は特定のタスクを実行し、開始したコンポーネントに直接結果を返しません。
バインドされたサービスは、ほかのコンポーネントが bindService でそれにバインドしたときに開始されます。コンポーネントがメソッドを呼び出し応答を受け取れるようにインターフェイスを提供し、たとえばアクティビティが音楽プレーヤーを制御します。バインドしているコンポーネントがなくなると停止されます。サービスは、開始されかつバインドされている場合、同時に両方になることもあります。
サービスの代わりに WorkManager を使うべきなのはどのようなときですか?
WorkManager は、アプリが閉じられたりデバイスが再起動されたりしても確実に実行されなければならないバックグラウンドの作業に対する、Google の推奨する解決策です。これは、データの同期、ログファイルのアップロード、定期的な後片付けなどです。
WorkManager はバッテリーとバックグラウンドの活動に関するシステムのルールを尊重し、たとえばデバイスが Wi-Fi に接続されているときや充電中のときだけ動作するように設定できます。サービス、特にフォアグラウンドサービスは、音楽の再生や進行中の通話など、作業がすぐに行われる必要があり、ユーザーに見える場合により適しています。アプリが開いている間の短時間の作業には、多くの場合コルーチンで十分です。
フォアグラウンドサービスはなぜ通知を表示しなければならないのですか?
フォアグラウンドサービスは、ユーザーがアプリを開いていない間に、長時間動作し、プロセッサー、バッテリー、位置情報などのリソースを使うことがあります。そのため、Android は、アプリがバックグラウンドで作業していることをユーザーが知るように、常時表示の通知を表示することを求めます。
これにより透明性が確保され、ユーザーはサービスを停止したりアプリを開いたりできます。より新しい Android のバージョンでは、開発者はメディアの再生、位置情報、データの同期など、サービスの種類も宣言し、関連する権限を持たなければなりません。Android 13 以降、ユーザーは通知の権限も許可しなければならず、これは通知の表示方法に影響します。
Android はバックグラウンドの作業にどのような制限を課しているのですか?
バッテリーを節約しユーザーのプライバシーを守るために、Android はバックグラウンドの作業に段階的に制限を導入してきました。Android 8.0 以降、バックグラウンドのアプリは一般に通常のバックグラウンドサービスを開始できず、システムは短時間の後にそれらを停止します。
Doze モードと App Standby は、デバイスが使われていないときやアプリがめったに使われないときに、ネットワークへのアクセスとジョブを延期します。より新しいバージョンでは、フォアグラウンドサービスに種類と権限が求められ、バックグラウンドから開始できるタイミングが制限されます。バックグラウンドでの位置情報へのアクセスには別の権限が必要です。そのため、バックグラウンドの作業は、可能な限り WorkManager でスケジュールするべきです。
サービス for dummies
Android のアプリのサービスは、誰もアプリを見ていないときにも働き続けられる、一種の目に見えないお手伝いです。音楽アプリを考えるとわかりやすいでしょう。曲を再生し、ホーム画面に戻ってメッセージを書いても、音楽は流れ続けます。それを担っているのがサービスです。アプリがユーザーが知っておくべきことにサービスを使うと、電話は小さな通知を表示するため、アプリが働いていることがはっきりわかります。同時に、Android はアプリがバックグラウンドで電力を使いすぎないようにするため、バッテリーが長持ちします。