web-dev-qa-db-ja.com

Android Broadcast Receiver vs Service

Androidのブロードキャストレシーバーとサービスの違いを明確にしようとしています。

アクティビティがstartServiceをインテントで呼び出すことでサービスを開始できることを理解しています。

ブロードキャストレシーバーは、コードまたはマニフェストで登録でき、sendBroadcastで呼び出すことができます。

いつどちらを使用しますか?

複数のブロードキャストレシーバーが同じインテントをリッスンできることは理解していますが、これはサービスには当てはまりません。

76
Chris Muench

Servicesは、ユーザーがフォアグラウンドで何をしているかに関係なく、一定期間バックグラウンドでアクションを実行することを意味します(ユーザーは、アクティビティ)。良い例は音楽プレーヤーサービスです。ユーザーは音楽プレーヤーアプリから音楽の再生を開始しますが、アプリを終了しても音楽は再生され続けます。

サービスは、複数のアプリケーションにわたるリソースへの共通アクセスを提供/管理するのにも役立ちます。これは、センサーなどのシステムリソースによく使用されます。

ブロードキャストレシーバーは、インテント(通常はサービスまたはシステムイベントによって送信されたもの)に応答し、何かを行い、実行されることを意図しています。ここでの例としては、ユーザーがNFC対応の電話にタグをタッチし、システムがそのインテントを作成し、登録済みのレシーバーがそれを処理して設定を変更する(音量を変更する、Bluetoothをオンにするなど)場合があります。

インテントがsendBroadcastを介してブロードキャストされると、インテントフィルターが一致するall受信者に送信されます。ただし、API26 +では、マニフェストに登録されているほとんどのレシーバーは、そのような状況ではもはや呼び出されないことに注意することが重要です。 詳細についてはGoogleドキュメント を参照してください。


例1:WebサイトにKevin Baconからの分離の程度を計算するように要求する関数(それを使用するアプリケーションから使用可能にする)を公開するとします。

この例は、長時間実行されるバックグラウンド操作とは対照的に、「何かをしてから戻る」ことに注意してください。

これはいくつかの方法で実装できます。

すべてのユーザーがアプリケーションにコンパイルするライブラリプロジェクトを作成します。

  • 現在、コードのコピーが複数あり、それらはすべて異なるバージョンである可能性があります。
  • 各リクエストは個別に処理されるため、リクエストをバッチ処理またはキャッシュできませんでした。

各リクエストを処理するブロードキャストレシーバーを作成します。

  • アプリケーションは、ベーコンの質問をする意図を受け入れるために放送受信機を登録します
  • 各アプリケーションは、質問をするインテントを送信します。
  • ブロードキャストレシーバーはインテントと次のいずれかを受け入れます。
    • リクエストをサービスに渡して処理を実行し、結果とともにインテントをリクエスターに送信します
    • 完了したら、Google Cloud Messagingを使用して応答するサーバーにリクエストを送信します
  • すべてのリクエストが1つのアプリケーションを経由するため、結果をバッチ/キャッシュできます
  • これは常に非同期です
  • APIは「意図」であり、機能を公開する最も簡単な方法ではありません

各リクエストを処理するサービスを作成します

  • アプリケーションはリクエストを処理するサービスを作成し、バインダーまたはAIDLを使用してAPIを公開します
  • APIは、同期(直接呼び出しと戻り)または非同期(リスナー登録を許可し、結果の準備ができたらリスナーを呼び出す)にすることができます。処理が非常に高速であると予想される場合にのみ、同期を選択してください。サーバー呼び出しはより頻繁に非同期的に処理されるべきです
  • APIは「メソッド呼び出し」です。機能を公開するためのはるかに使いやすい方法です。

例2:データ分析を実行して、データのパターンを見つけたい

Background Threadユーザーが同じアプリケーションおよび同じアクティビティにいる間にすべての処理が発生する場合、バックグラウンドスレッド(またはバックグラウンドを管理するAsyncTask)スレッド)は良いアプローチでしょう

Service処理の実行中にユーザーがアプリケーションを終了できるようにする場合(および後で結果を通知する場合)、または処理の実行中に同じアプリケーションで複数のアクティビティを実行する場合は、サービスがより良いアプローチです

106

ブロードキャストレシーバー

引用 Dianne Hackborn on the Android Developers blog

ブロードキャストを処理する場合、アプリケーションには、その作業を行うための固定の時間セット(現在は10秒)が与えられます。その時間内に完了しない場合、アプリケーションは誤動作していると見なされ、そのプロセスはすぐにバックグラウンド状態に移行され、必要に応じてメモリのために強制終了されます。

ブロードキャストレシーバーは、最大時間(通常10秒)によって制限されているため、終了する必要があります。

サービス

アクションに時間がかかる場合(インターネットへの接続には時間がかかる場合があります)。この目的のために、必ずレシーバーまたはアクティビティからサービスを呼び出す必要があります。 Androidオペレーティングシステム。

結論:

  1. 一般的に言えば、アプリケーションに重要なすべての作業(フェッチ、解析、キャッシュ、データベースの更新)は、Androidに長く存在するため、Serviceに移動する必要があります。ほぼすべてのソーシャルネットワーキングサイトがそこにあると考えているように、STICKY_SERVICESこれは面倒な作業をすべて行います。

  2. BroadcastReceiverは、主にサービスを開始するために使用されます。通常、アプリケーションによって異なります。ほとんどのアプリケーションは、ネットワークがUP OR DOWN。これらの助けを借りて、ConnectivityManagerServiceによって開始されるたびにブロードキャストするためにBroadcastReceiverを使用します。

70
Vikalp Patel

最初に、 Broadcast ReceiverServices の両方のドキュメントを読んでください。

便利なチュートリアル here および here を見つけることができます。

最後に、長い話を短くするために:

サービスはリクエストに応じて開始されます(startService(intent))。 The Broadcast receiverはインテントリスナーと考え​​ることができます。

5
a fair player