81

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

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

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

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

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

4

3 に答える 3

117

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

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

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

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


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

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

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

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

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

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

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

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

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

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

バックグラウンド スレッドユーザーが同じアプリケーションと同じアクティビティを使用している間にすべての処理が発生する必要がある場合は、バックグラウンド スレッド (またはコルーチン) を使用することをお勧めします。

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

于 2013-01-27T15:47:17.163 に答える
86

放送受信機

AndroidDevelopersブログでDianneHackbornを引用:

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

放送受信機は最大時間(通常10秒)によって制限され、終了する必要があります。

サービス

アクションに時間がかかる場合(インターネットへの接続には時間がかかる場合があります)。より好ましくは、バックグラウンドでの実行として。この目的のために、受信者またはアクティビティからサービスを呼び出す必要があります。彼らはAndroidオペレーティングシステムによって最後に殺されます。

結論:

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

  2. BroadcastReceiver主にサービスを開始するために使用されます。それは一般的にアプリケーションに依存します。ほとんどのアプリケーションはConnectivityManager、ネットワークがアップまたはダウンしているときはいつでもブロードキャストに使用します。これらの助けを借りて、Serviceによって開始されBroadcastReceiverます。

于 2013-01-27T15:48:56.323 に答える
6

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

ここここ で役立つチュートリアルを見つけることができます。

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

リクエストに応じてサービスが開始されます (startService(intent))。ブロードキャスト レシーバーはインテント リスナーと考え​​ることができます。

于 2013-01-27T16:02:39.137 に答える