Androidのブロードキャストレシーバーとサービスの違いを明確にしようとしています。
アクティビティがstartService
をインテントで呼び出すことでサービスを開始できることを理解しています。
ブロードキャストレシーバーは、コードまたはマニフェストで登録でき、sendBroadcast
で呼び出すことができます。
いつどちらを使用しますか?
複数のブロードキャストレシーバーが同じインテントをリッスンできることは理解していますが、これはサービスには当てはまりません。
Servicesは、ユーザーがフォアグラウンドで何をしているかに関係なく、一定期間バックグラウンドでアクションを実行することを意味します(ユーザーは、アクティビティ)。良い例は音楽プレーヤーサービスです。ユーザーは音楽プレーヤーアプリから音楽の再生を開始しますが、アプリを終了しても音楽は再生され続けます。
サービスは、複数のアプリケーションにわたるリソースへの共通アクセスを提供/管理するのにも役立ちます。これは、センサーなどのシステムリソースによく使用されます。
ブロードキャストレシーバーは、インテント(通常はサービスまたはシステムイベントによって送信されたもの)に応答し、何かを行い、実行されることを意図しています。ここでの例としては、ユーザーがNFC対応の電話にタグをタッチし、システムがそのインテントを作成し、登録済みのレシーバーがそれを処理して設定を変更する(音量を変更する、Bluetoothをオンにするなど)場合があります。
インテントがsendBroadcastを介してブロードキャストされると、インテントフィルターが一致するall受信者に送信されます。ただし、API26 +では、マニフェストに登録されているほとんどのレシーバーは、そのような状況ではもはや呼び出されないことに注意することが重要です。 詳細についてはGoogleドキュメント を参照してください。
例1:WebサイトにKevin Baconからの分離の程度を計算するように要求する関数(それを使用するアプリケーションから使用可能にする)を公開するとします。
この例は、長時間実行されるバックグラウンド操作とは対照的に、「何かをしてから戻る」ことに注意してください。
これはいくつかの方法で実装できます。
すべてのユーザーがアプリケーションにコンパイルするライブラリプロジェクトを作成します。
各リクエストを処理するブロードキャストレシーバーを作成します。
各リクエストを処理するサービスを作成します
例2:データ分析を実行して、データのパターンを見つけたい
Background Threadユーザーが同じアプリケーションおよび同じアクティビティにいる間にすべての処理が発生する場合、バックグラウンドスレッド(またはバックグラウンドを管理するAsyncTask)スレッド)は良いアプローチでしょう
Service処理の実行中にユーザーがアプリケーションを終了できるようにする場合(および後で結果を通知する場合)、または処理の実行中に同じアプリケーションで複数のアクティビティを実行する場合は、サービスがより良いアプローチです
ブロードキャストレシーバー
引用 Dianne Hackborn on the Android Developers blog :
ブロードキャストを処理する場合、アプリケーションには、その作業を行うための固定の時間セット(現在は10秒)が与えられます。その時間内に完了しない場合、アプリケーションは誤動作していると見なされ、そのプロセスはすぐにバックグラウンド状態に移行され、必要に応じてメモリのために強制終了されます。
ブロードキャストレシーバーは、最大時間(通常10秒)によって制限されているため、終了する必要があります。
サービス
アクションに時間がかかる場合(インターネットへの接続には時間がかかる場合があります)。この目的のために、必ずレシーバーまたはアクティビティからサービスを呼び出す必要があります。 Androidオペレーティングシステム。
結論:
一般的に言えば、アプリケーションに重要なすべての作業(フェッチ、解析、キャッシュ、データベースの更新)は、Androidに長く存在するため、Service
に移動する必要があります。ほぼすべてのソーシャルネットワーキングサイトがそこにあると考えているように、STICKY_SERVICES
これは面倒な作業をすべて行います。
BroadcastReceiver
は、主にサービスを開始するために使用されます。通常、アプリケーションによって異なります。ほとんどのアプリケーションは、ネットワークがUP OR DOWN。これらの助けを借りて、ConnectivityManager
がService
によって開始されるたびにブロードキャストするためにBroadcastReceiver
を使用します。
最初に、 Broadcast Receiver と Services の両方のドキュメントを読んでください。
便利なチュートリアル here および here を見つけることができます。
最後に、長い話を短くするために:
サービスはリクエストに応じて開始されます(startService(intent))。 The Broadcast receiverはインテントリスナーと考えることができます。