Android广播接收器与服务

Chr*_*nch 76 android android-service android-broadcast

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

我知道活动可以通过调用startService意图来启动服务.

广播接收器可以在代码或清单中注册,并可以使用sendBroadcast.

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

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

Sco*_*eld 106

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

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

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

当通过sendBroadcast广播意图时,它将被发送到具有匹配意图过滤器的所有接收器.但是,请务必注意,在API26 +中,在此类情况下不再调用清单中注册的大多数接收器,有关详细信息,请参阅Google文档.


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

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

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

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

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

创建一个广播接收器来处理每个请求.

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

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

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

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

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

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

  • 不是"创建一个广播接收器来处理每个请求." 不稳定,因为你正在从广播接收器发出可能被杀死的异步请求? (4认同)
  • @pfrank - 良好的呼叫 - 接收方确实需要将其传递给服务,或者向服务器发送请求,该服务器将在完成后通过Google Cloud消息通知.(我用这个编辑了上面的内容) (2认同)

Vik*_*tel 73

广播接收器

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

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

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

服务

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

结论:

  1. 一般来说,对应用程序很重要的所有工作(获取,解析,缓存,更新数据库)都应该移动到ServiceAndroid上.因为你几乎认为所有的社交网站都有STICKY_SERVICES那些麻烦的工作.

  2. BroadcastReceiver主要用于启动服务.它通常取决于应用.ConnectivityManager无论何时网络是向上或向下,大多数应用程序都用于广播.在这些的帮助下Service开始BroadcastReceiver.

  • 提及10秒+1 (17认同)
  • 谢谢你提到10秒钟. (4认同)

a f*_*yer 5

首先,阅读广播接收器服务的文档.

你可以在这里这里找到有用的教程.

最后,长话短说:

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

  • 这里的“长话短说”结论对我的理解是不正确的,因为服务也可以完全从基于意图过滤器的意图开始。广播接收器是一个系统监听器(来自操作系统的事件),或其他应用程序的监听器。服务是您在应用程序内部使用的内容。 (2认同)