サービスは、ユーザーがフォアグラウンドで何をしているかに関係なく、一定期間バックグラウンドでアクションを実行することを目的としています (ユーザーはアクティビティを切り替えている可能性があります)。良い例は音楽プレーヤー サービスです。ユーザーは音楽プレーヤー アプリで音楽の再生を開始しますが、アプリを終了しても音楽は再生され続けます。
サービスは、複数のアプリケーション間でリソースへの共通アクセスを提供/管理するのにも役立ちます。これは、センサーなどのシステム リソースによく使用されます。
ブロードキャスト レシーバーは、インテント (通常はサービスまたはシステム イベントによって送信されたもの) に応答し、何かを実行し、完了させることを目的としています。ここでの例として、ユーザーが NFC 対応の電話をタグにタッチすると、システムがそのインテントを作成し、登録された受信機がそれを処理していくつかの設定を変更します (音量の変更、Bluetooth のオンなど)。
sendBroadcast を介してインテントがブロードキャストされると、一致するインテント フィルタを持つすべての受信者に送信されます。ただし、API26+ では、マニフェストに登録されているほとんどのレシーバーがこのような状況で呼び出されなくなったことに注意することが重要です。詳細については、Google ドキュメントを参照してください。
例 1: Web サイトに Kevin Bacon からの分離度を計算するように要求する関数を (それを使用したい任意のアプリケーションから使用できるように) 公開したいとします。
この例は、長時間実行されるバックグラウンド操作を実行するのではなく、「何かを実行して戻る」ことに注意してください。
これはいくつかの方法で実装できます。
すべてのユーザーがアプリケーションにコンパイルするライブラリ プロジェクトを作成します。
- コードのコピーが複数あり、それらはすべて異なるバージョンである可能性があります。
- 各リクエストは個別に処理されるため、リクエストをバッチ処理またはキャッシュできませんでした。
各リクエストを処理するブロードキャスト レシーバを作成します。
- アプリケーションはブロードキャスト レシーバーを登録して、ベーコンに質問するインテントを受け入れます
- 各アプリケーションは、質問をするために Intent を送信します。
- ブロードキャスト レシーバはインテントを受け入れ、次のいずれかを行います。
- リクエストをサービスに渡して処理を実行し、結果とともに Intent をリクエスタに送信します。
- 完了時に Google Cloud Messaging を使用して応答するサーバーにリクエストを送信します
- すべてのリクエストが 1 つのアプリケーションを通過するため、結果をバッチ処理/キャッシュできます
- これは常に非同期です
- API は「インテント」です - 機能を公開するための最も友好的な方法ではありません
各リクエストを処理するサービスを作成する
- アプリケーションはリクエストを処理するサービスを作成し、Binder または AIDL を介して API を公開します
- API は、同期 (直接呼び出して返す) または非同期 (リスナーの登録を許可し、結果の準備ができたらリスナーを呼び出す) にすることができます。処理が非常に高速であることが予想される場合にのみ、同期を選択してください。サーバー呼び出しはより頻繁に非同期で処理する必要があります
- API は「メソッド呼び出し」であり、機能を公開するためのより使いやすい方法です
例 2: データ分析を実行して、データのパターンを見つけたい
バックグラウンド スレッドユーザーが同じアプリケーションと同じアクティビティを使用している間にすべての処理が発生する必要がある場合は、バックグラウンド スレッド (またはコルーチン) を使用することをお勧めします。
サービス処理の実行中にユーザーがアプリケーションを終了できるようにする (そして後で結果を通知する) 場合、または処理の実行中にユーザーが同じアプリケーション内の複数のアクティビティを進行できるようにする場合は、サービスを使用します。より良いアプローチになる