Android广播接收器与服务

我正在尝试澄清android中广播接收机和服务的区别。

我明白,一个活动可以启动一个服务,通过意图调用startService

广播接收机可以在代码或清单中注册,并可以通过sendBroadcast

你什么时候使用一个和另一个?

我明白,多个广播接收机可以听同样的意图,这不是一个服务的情况。

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

服务也可用于跨多个应用程序提供/pipe理资源的通用访问。 这通常用于系统资源,如传感器。

广播接收器是为了响应一个意图(通常是由服务或系统事件发送的意图),做一些事情,并做好。 这里的一个例子可能是用户将支持NFC的电话接触到标签,系统为其创build意图,并且注册的接收方处理它以改变某些设置(改变音量,打开蓝牙等)。

当通过sendBroadcast广播一个意图时,它将被发送到具有匹配意向filter的所有接收者。 但是,需要注意的是,在API26 +中,大多数在清单中注册的接收者在这种情况下不再被调用,请参阅Google文档以获取更多信息 。


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

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

你可以通过几种方式来实现:

创build一个所有用户编译成应用程序的库项目。

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

创build一个广播接收器来处理每个请求。

  • 你的应用程序注册一个广播接收器来接受一个请求培根问题的意图
  • 每个应用程序发送一个意图问这个问题。
  • 广播接收机也接受意图
    • 将请求传递给服务进行处理,将请求发送给请求者,并返回结果
    • 发送请求到服务器,服务器完成后将使用Google Cloud Messaging进行响应
  • 由于所有请求都通过一个应用程序,因此您可以批量/caching结果
  • 这总是asynchronous的
  • API是“Intents” – 不是公开您的function的最友好的方式

创build一个服务来处理每个请求

  • 您的应用程序创build一个服务来处理请求,并通过活页夹或使用AIDL公开API
  • API可以是同步的(直接调用和返回)或asynchronous的(允许监听器注册,并在结果准备就绪时调用监听器)。 如果预计处理速度非常快,则只应select同步; 服务器调用应该更经常地被asynchronous处理
  • API是“方法调用” – 一种更加友好的方式来公开function

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

后台线程如果所有的处理应该在用户在同一个应用程序中并且在同一个Activity上时发生,后台线程(或者pipe理后台线程的AsyncTask)将会是一个很好的方法

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

广播接收机

在Android开发者博客中引用Dianne Hackborn :

在处理广播时,应用程序被赋予固定的一组时间(现在是10秒)来完成它的工作。 如果在那个时候没有完成,应用程序被认为是行为不端,并且它的进程立即被抛入后台状态,如果需要的话被杀死。

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

服务

如果你的行动需要更长的时间(连接到互联网可以采取一些)。更喜欢作为在后台运行。 你绝对应该从接收者或活动中调用一个服务来达到这个目的。 他们最后被android操作系统杀死。

结论:

  1. 一般来说,对于您的应用程序来说重要的所有工作(读取,parsing,caching,更新数据库)应该移到Service因为他们长期居住在Android上。 正如你几乎认为,所有的社交网站都有STICKY_SERVICES这所有麻烦的工作。

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

首先,阅读广播接收机和服务的文档。

你可以在这里和这里find有用的教程。

最后,长话短说:

服务根据您的请求开始(startService(intent))。 您可以将“广播”接收器视为意图监听器。