android中的Broadcast Receiver和ResultReceiver

时间:2012-11-01 13:26:01

标签: android

Android中的 BroadcastReceiver ResultReceiver 有什么区别?

4 个答案:

答案 0 :(得分:35)

结果接收者:

Generic interface for receiving a callback result from someone.

广播接收器:

Base class for code that will receive intents sent by sendBroadcast().

修改

背景:所有网络操作/长时间运行操作都应该远离主线程。有两种方法可以做到这一点:

  1. 异步任务 - 对于简单的网络,例如retreive a image / do db 处理
  2. 服务 - 适用于复杂的长时间运行后台进程
  3. 如果您需要在主线程之外执行工作,但只有在用户与您的应用程序交互时,您应该创建一个新线程而不是服务。例如,如果要播放某些音乐,但仅在活动运行时,可以创建异步线程。但是,如果您希望即使在用户退出应用程序(例如下载)之后该流程仍会继续,那么请使用服务

    让我们说你选择2.现在

    1. 您的活动会向您的服务发送网络请求
    2. 您的服务使用say DefaultHttpClient
    3. 执行该服务
    4. 它会将数据发回您的活动。

      此处接收数据的第三步可以通过两种方式完成

    5.   

      1。)广播接收器:多个接收器可以接收您的数据。如果您想在应用程序之间发送数据/通知(例如,您还要与fb和twitter交互,您的网络广播使用多个接收器),则使用此选项,   无论何时你发送广播它的系统广播。

           

      2。)结果接收者:您的应用程序是数据的唯一接收者。它是您实现的接口,并通过putExtra将其传递给intentService。然后,IntentService将获取此对象   并调用其receiver.send函数发送任何内容(在bundle中)   呼叫活动。结果接收器有   如果你的所有通信都是广播接收者的偏好   在您的应用程序内部

      编辑:我还应该提一下这个警告

        

      警告:服务在其托管进程的主线程中运行 -   service不会创建自己的线程,也不会单独运行   过程(除非您另行指定)。这意味着,如果你的   服务将进行任何CPU密集型工作或阻塞操作   (如MP3播放或网络),你应该创建一个新的线程   在服务范围内做这项工作。通过使用单独的线程,你   将降低应用程序无响应(ANR)错误的风险   应用程序的主线程可以保持专用于用户交互   与您的活动。

答案 1 :(得分:10)

BroadcastReceiver是接收广播的接收器。这些是由某人发送的,意图是可能有许多接收者接收它们(如无线电广播)。

另一方面,ResultReceiver旨在接收某人的回调结果。因此,这可以与对讲机进行比较,在那里你打电话给某人然后将从你所呼叫的那个人那里得到答案(结果)。

答案 2 :(得分:3)

这两个类完全不同。它实际上与广播结果之间存在完全相同的差异。

  • 什么是广播?简单来说,它是一些对整个系统可见的消息,它可以被系统的每个部分消耗(它知道合同),它不是由smb reuest发起的;
  • 结果是什么?这是我们期望从系统的另一部分接收的东西。通常只有一个接收器用于结果,并且通常接收器已经请求处理以获得结果(感觉差异 - 对于广播没有人需要做任何'请求'来让它发起);

从逻辑的角度来看,这是解释。从代码的角度来看,如果您要比较BroadcastReceiver和ResultReceiver,您可能会发现巨大的差异。基本上这两个类都是建立在IPC之上的,但是BroadcastReceiver要复杂得多,因为它的性质不同(我在第一部分试图解释)。

答案 3 :(得分:0)

广播接收器

广播接收器是响应系统范围广播公告的组件。例如,广播宣布屏幕已关闭,电池电量低或拍摄照片。应用程序还可以启动广播 - 例如,让其他应用程序知道某些数据已下载到设备并可供他们使用。虽然广播接收器不显示用户界面,但是它们可以创建状态栏通知以在广播事件发生时警告用户。但更多的是,广播接收器只是其他组件的“网关”,旨在完成非常少量的工作。例如,它可能会启动服务以根据事件执行某些工作。

结果接收器

如果您的服务将成为您应用程序的一部分,那么您将使它变得比它需要的更复杂。由于您有一个从Restful Web Service获取某些数据的简单用例,因此您应该查看ResultReceiverIntentService

当您要执行某些操作时,此Service + ResultReceiver模式通过使用startService()启动或绑定到服务来工作。您可以指定要执行的操作,并通过Intent中的extras传递ResultReceiver(活动)。