Android广播接收器与服务

时间:2013-01-27 15:33:11

标签: android android-service android-broadcast

我试图澄清Android中广播接收器和服务之间的区别。

我了解活动可以通过调用startService来启动服务。

广播接收器可以在代码或清单中注册,可以使用sendBroadcast进行调用。

你何时会使用其中一个?

据我所知,多个广播接收器可以监听相同的意图,而服务并非如此。

3 个答案:

答案 0 :(得分:104)

服务旨在在后台执行一段时间的操作,无论用户在前台做什么(用户可以在活动之间切换)。一个很好的例子是音乐播放器服务 - 用户通过音乐播放器应用程序开始播放音乐,但当他们退出应用程序时,音乐会继续播放。

服务对于跨多个应用程序提供/管理对资源的公共访问也很有用。这通常用于系统资源,例如传感器。

广播接收器旨在响应意图(通常是由服务或系统事件发送的意图),做某事并完成。这里的示例可能是用户将支持NFC的手机触摸到标签,系统为其创建意图,并且注册的接收器处理它以更改某些设置(更改音量,打开蓝牙等)。

当通过sendBroadcast广播意图时,它将被发送到具有匹配意图过滤器的所有接收器。但是,重要的是要注意,在API26 +中,在此类情况下不再调用清单中注册的大多数接收者,请参阅the Google docs for more information


示例1:假设您要公开一个函数(可从任何想要使用它的应用程序获得),要求网站计算与Kevin Bacon的分离程度。

请注意,此示例是“执行某些操作并返回”,而不是执行长时间运行的后台操作。

您可以通过多种方式实现此目的:

创建一个所有用户都可以编译到其应用程序中的库项目。

  • 现在有多个代码副本,它们可能都是不同的版本。
  • 您无法批处理或缓存请求,因为每个请求都是独立处理的。

创建广播接收器以处理每个请求。

  • 您的应用程序注册广播接收器以接受询问培根问题的意图
  • 每个应用程序发送一个Intent来提问。
  • 广播接收器接受Intent和其中之一
    • 将请求传递给服务进行处理,将处理结果发送给请求者
    • 向服务器发送请求,该服务将在完成后使用Google Cloud Messaging进行响应
  • 因为所有请求都通过一个应用程序,您可以批量/缓存结果
  • 这始终是异步的
  • API是“意图” - 不是公开功能的最友好方式

创建处理每个请求的服务

  • 您的应用程序创建一个服务来处理请求,并通过Binder或使用AIDL公开API
  • API可以是同步的(直接调用和返回)或异步的(允许侦听器注册并在结果准备好时调用侦听器)。如果预计处理速度非常快,您应该只选择同步;服务器调用应该更经常地异步处理
  • API是“方法调用” - 一种更友好的方式来公开功能

示例2:您希望执行一些数据分析以查找数据中的某些模式

后台线程如果在用户处于同一个应用程序和同一个Activity上时发生所有处理,则后台线程(或管理后台线程的AsyncTask)将是一个很好的方法< / p>

服务如果您希望允许用户在执行处理时退出应用程序(并在稍后通知他们结果),或允许他们在同一应用程序中执行多个活动在处理过程中,服务将是一种更好的方法

答案 1 :(得分:70)

广播接收器

引用Dianne Hackborn on the Android Developers blog

  

处理广播时,应用程序会获得一组固定的时间(当前为10秒)来完成其工作。   如果它在那段时间内没有完成,那么应用程序被认为是行为不端,并且如果需要,它的进程会立即进入后台状态以便为内存被杀死。

广播接收器受最大时间限制(一般为10秒),必须完成。

<强>服务

如果您的行动需要更长的时间(连接到互联网可能会花费一些时间)。更像是在后台运行。你肯定应该从接收者或活动呼叫服务为此目的。它们最后被Android操作系统杀死。

结论:

  1. 一般来说,对您的应用程序很重要的所有工作(获取,解析,缓存,更新数据库)都应该移动到Service,因为它们在Android上很长时间。正如您几乎认为所有社交网站都有STICKY_SERVICES所做的所有繁琐的工作。

  2. BroadcastReceiver主要用于启动服务。它通常取决于应用。网络处于UP或DOWN时,大多数应用程序使用ConnectivityManager进行广播。在这些Service的帮助下,BroadcastReceiver启动了

答案 2 :(得分:5)

首先,阅读Broadcast ReceiverServices的文档。

您可以找到有用的教程herehere

最后,长话短说:

服务根据您的请求启动(startService(intent))。 您可以将广播接收器视为目标侦听器。