AndroidのBroadcastReceiverとResultReceiverの違いは何ですか?
4 に答える
結果レシーバー:
Generic interface for receiving a callback result from someone.
放送受信機:
Base class for code that will receive intents sent by sendBroadcast().
編集:
背景:すべてのネットワーク操作/長時間実行操作は、メインスレッドから離れた場所で実行する必要があります。これを行う2つの方法:
- 非同期タスク-画像の取得/データベース処理の実行などの単純なネットワークの場合
- サービス-複雑で長時間実行されるバックグラウンドプロセスの場合
メインスレッドの外部で作業を実行する必要があるが、ユーザーがアプリケーションを操作しているときにのみ実行する必要がある場合は、代わりに、サービスではなく新しいスレッドを作成する必要があります。たとえば、音楽を再生したいが、アクティビティの実行中にのみ、非同期スレッドを作成する場合があります。ただし、ユーザーがアプリを終了した後もプロセスを続行する場合(ダウンロードなど)は、サービスを使用してください
2つ選んだとしましょう。
あなたのアクティビティはあなたのサービスにウェブリクエストを送信します
あなたのサービスは、たとえばDefaultHttpClientを使用してそれを実行します
それはあなたの活動にデータを送り返します。
ここでデータを受信する3番目のステップは、2つの方法で実行できます。
1.)ブロードキャストレシーバー:複数のレシーバーがデータを受信できます。送信されたシステム全体にブロードキャストを送信するときはいつでも、アプリケーション間でデータ/通知を送信する場合に使用されます(たとえば、Webブロードキャスト用の複数の受信者であるfbやtwitterとも対話します)。
2.)結果の受信者:アプリケーションがデータの唯一の受信者です。これは、実装し、putExtraを介してintentServiceに渡すインターフェイスです。次に、IntentServiceはこのオブジェクトをフェッチし、そのreceiver.send関数を呼び出して、呼び出し元のアクティビティに(バンドルで)何かを送信します。すべての通信がアプリケーションの内部にある場合、結果の受信者はブロードキャスト受信者よりも優先されます
編集:私もこの注意に言及する必要があります
注意:サービスはホスティングプロセスのメインスレッドで実行されます。サービスは独自のスレッドを作成せず、別のプロセスで実行されません(特に指定しない限り)。つまり、サービスがCPUを集中的に使用する作業やブロック操作(MP3再生やネットワークなど)を実行する場合は、その作業を実行するためにサービス内に新しいスレッドを作成する必要があります。別のスレッドを使用することで、Application Not Responding(ANR)エラーのリスクを軽減し、アプリケーションのメインスレッドをユーザーによるアクティビティの操作専用に保つことができます。
BroadcastReceiverは、ブロードキャストを受信するレシーバーです。それらは、(ラジオ放送のように)それらを受信する多くの受信者が存在する可能性があることを意図して誰かによって送信されます。
一方、ResultReceiverは、誰かからのコールバック結果を受け取ることを目的としています。したがって、これは、誰かに電話をかけ、電話をかけた相手から回答(結果)を受け取るトランシーバーと比較できます。
これらの2つのクラスは完全に異なります。実際には、 BroadcastとResultの違いはまったく同じです。
- 何を放送しますか?簡単に言うと、これはシステム全体に表示されるメッセージであり、システムのすべての部分(コントラクトを知っている)で使用できます。これは、smbreuestによって発信されたものではありません。
- 結果とは何ですか?これは、システムの別の部分から受け取ることを期待しているものです。通常、結果の受信者は1つだけであり、通常、その受信者は結果を取得するための処理を要求します(違いを感じてください。ブロードキャストの場合、発信を許可するために「要求」を行う必要はありません)。
それは論理的な観点からの説明でした。コードの観点から、BroadcastReceiverとResultReceiverを比較すると、大きな違いが見られます。基本的に、両方のクラスはIPCの上に構築されていますが、BroadcastReceiverは性質が異なるため(最初の部分で説明しようとしました)、はるかに複雑です。
放送受信機
ブロードキャストレシーバーは、システム全体のブロードキャストアナウンスに応答するコンポーネントです。たとえば、画面がオフになっている、バッテリーが少なくなっている、または写真がキャプチャされたことを通知するブロードキャスト。アプリケーションはブロードキャストを開始することもできます。たとえば、他のアプリケーションに、一部のデータがデバイスにダウンロードされ、使用できることを通知します。ブロードキャストレシーバーはユーザーインターフェイスを表示しませんが、ブロードキャストイベントが発生したときにユーザーに警告するステータスバー通知を作成する場合があります。ただし、放送受信機は他のコンポーネントへの単なる「ゲートウェイ」であり、最小限の作業を行うことを目的としています。たとえば、イベントに基づいて何らかの作業を実行するサービスを開始する場合があります。
結果レシーバー
サービスがアプリケーションの一部になる場合は、必要以上に複雑になります。Restful Webサービスからデータを取得する単純なユースケースがあるため、ResultReceiverとIntentServiceを調べる必要があります。
このService+ResultReceiverパターンは、何らかのアクションを実行するときにstartService()を使用してサービスを開始またはバインドすることで機能します。実行する操作を指定し、インテントのエクストラを介してResultReceiver(アクティビティ)を渡すことができます。