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。现在
您的活动向您的服务发送网络请求
您的服务使用说 DefaultHttpClient 执行该操作
它将数据发送回您的活动。
这里第三步接收数据可以通过两种方式完成
1.)广播接收器:多个接收器可以接收您的数据。如果您想跨应用程序发送数据/通知(例如,您还与 fb 和 twitter 交互,您的网络广播的多个接收器),则在您发送广播时使用它发送的系统范围。
2.) 结果接收者:您的应用程序是数据的唯一接收者。它是您实现并通过 putExtra 将其传递给 intentService 的接口。IntentService 然后会获取这个对象并调用它的receiver.send 函数来发送任何东西(捆绑)到调用活动。如果您的所有通信都在您的应用程序内部,则结果接收器优先于广播接收器
编辑:我还应该提到这个警告
注意:服务在其宿主进程的主线程中运行——服务不会创建自己的线程,也不会在单独的进程中运行(除非您另外指定)。这意味着,如果您的服务要执行任何 CPU 密集型工作或阻塞操作(例如 MP3 播放或网络),您应该在服务中创建一个新线程来完成这项工作。通过使用单独的线程,您将降低应用程序无响应 (ANR) 错误的风险,并且应用程序的主线程可以保持专用于用户与您的活动的交互。
BroadcastReceiver 是接收广播的接收器。这些是由某人发送的,目的是可以有许多接收器接收它们(如无线电广播)。
另一方面,ResultReceiver 旨在接收来自某人的回调结果。因此,这可以与对讲机进行比较,您在其中呼叫某人,然后将从您呼叫的人那里收到答案(结果)。
这两个类是完全不同的。它实际上与Broadcast和Result之间的区别完全相同。
- 它广播什么?简而言之,它是整个系统可见的一些消息,它可以被系统的每个部分(知道合约)使用,它不是由 smb reuest 发起的;
- 结果是什么?这是我们期望从系统的另一部分收到的东西。通常只有一个结果接收器,并且通常该接收器已请求处理以获得结果(感觉不同 - 对于广播,没有人需要做任何“请求”来让它产生);
这是从逻辑角度的解释。从代码的角度来看,如果您比较 BroadcastReceiver 和 ResultReceiver 您可以观察到巨大的差异。基本上这两个类都是建立在 IPC 之上的,但是 BroadcastReceiver 复杂得多,因为它的性质不同(我在第一部分试图解释)。
广播接收器
广播接收器是响应系统范围的广播公告的组件。例如,广播宣布屏幕已关闭、电池电量低或已拍摄照片。应用程序还可以发起广播——例如,让其他应用程序知道某些数据已下载到设备并可供他们使用。尽管广播接收器不显示用户界面,但它们可以创建状态栏通知以在广播事件发生时提醒用户。更重要的是,广播接收器只是其他组件的“网关”,旨在完成非常少量的工作。例如,它可能会启动一项服务以根据事件执行某些工作。
结果接收器
如果您的服务将成为您应用程序的一部分,那么您将使其变得比需要的复杂得多。由于您有一个从 Restful Web 服务获取一些数据的简单用例,您应该研究ResultReceiver和IntentService。
当您想要执行某些操作时,此 Service + ResultReceiver 模式通过使用 startService() 启动或绑定到服务来工作。您可以指定要执行的操作,并通过 Intent 中的 extras 传入您的 ResultReceiver(活动)。