在android中的广播接收器和ResultReceiver

在android中的BroadcastReceiverResultReceiver有什么区别?

Solutions Collecting From Web of "在android中的广播接收器和ResultReceiver"

结果接收者:

Generic interface for receiving a callback result from someone. 

广播接收机:

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

编辑:

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

  1. asynchronous任务 – 对于简单的networking就像说retreive一个图像/做数据库处理
  2. 服务 – 用于复杂的长时间运行后台进程

如果您需要在主线程之外执行工作,但仅在用户与应用程序进行交互时执行工作,则可能应该创build一个新线程而不是服务。 例如,如果您想播放某些音乐,但仅在您的活动正在运行时,您可以创build一个asynchronous线程。 但是,如果您希望在用户退出应用程序(例如下载)之后继续进行此过程,请使用服务

假设你select2.现在

  1. 您的活动将Web请求发送到您的服务
  2. 你的服务使用DefaultHttpClient来执行
  3. 它将数据发送回您的活动。

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

1.)广播接收机:多个接收机可以接收您的数据。 如果您希望跨应用程序发送数据/通知(例如,您也正在与fb和twitter进行交互,多个接收器用于您的networking广播),则可以在发送系统广播时发送广播。

2.)结果接收者:您的应用程序是数据的唯一接收者。 这是一个你实现的接口,并通过putExtra传递给intentService。 然后,IntentService将获取这个对象并调用其receiver.send函数来发送任何东西(捆绑)到调用活动。 如果您的所有通信都在您的应用程序的内部,则结果接收方优先于广播接收方

编辑:我也应该提到这个谨慎

注意 :服务运行在其宿主进程的主线程中 – 服务不会创build自己的线程,也不会在单独的进程中运行(除非另有指定)。 这意味着,如果你的服务要做CPU密集的工作或阻塞操作(如MP3播放或networking连接),你应该在服务中创build一个新的线程来完成这个工作。 通过使用单独的线程,您将降低应用程序无响应(ANR)错误的风险,并且应用程序的主线程可以保持专用于用户与您的活动进行交互。

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

ResultReceiver另一方面是为了接收某人的callback结果。 所以这可以用一个对讲机来对比,在那里你打电话给某人,然后从你所说的那个人那里得到一个答案(结果)。

这两个类是完全不同的。 实际上, 广播结果之间的差异是相同的。

  • 什么广播? 简而言之,它是一些对整个系统可见的信息,它可以被系统的每个部分(知道合同)消耗,而不是由任何人发起;
  • 什么是结果? 这是我们期望从系统的另一部分获得的东西。 通常只有一个接收者的结果,通常接收方已经要求处理,以获得结果(感觉不同 – 广播没有人需要做任何“请求”,让它发起);

这是从逻辑的angular度来解释。 从代码的angular度来看,如果您将比较BroadcastReceiver和ResultReceiver您可以观察到巨大的差异。 基本上这两个类都build立在IPC之上,但BroadcastReceiver更复杂,因为它有不同的性质(我试图在第一部分中进行解释)。

广播接收机

广播接收机是响应系统广播通知的组件。 例如,广播宣布屏幕已closures,电池电量不足或拍摄了照片。 应用程序也可以启动广播 – 例如,让其他应用程序知道某些数据已经下载到设备中并可供其使用。 尽pipe广播接收机不显示用户界面,但他们可能会创build一个状态栏通知,以在发生广播事件时提醒用户。 更多的是,广播接收器只是其他组件的“通道”,并且打算做很less的工作。 例如,它可能会启动一个服务来根据事件执行一些工作。

结果接收器

如果你的服务将成为你应用程序的一部分,那么你正在使它比需要的更复杂。 既然你有一个从Restful Web Service获取数据的简单用例,你应该看看ResultReceiver和IntentService 。

这个Service + ResultReceiver模式通过startService()来启动或绑定服务,当你想做一些动作。 你可以指定这个操作来执行你的ResultReceiver(活动),并通过Intent中的extras。