我试图澄清Android中广播接收器和服务之间的区别。
我了解活动可以通过调用startService
来启动服务。
广播接收器可以在代码或清单中注册,可以使用sendBroadcast
进行调用。
你何时会使用其中一个?
据我所知,多个广播接收器可以监听相同的意图,而服务并非如此。
答案 0 :(得分:104)
服务旨在在后台执行一段时间的操作,无论用户在前台做什么(用户可以在活动之间切换)。一个很好的例子是音乐播放器服务 - 用户通过音乐播放器应用程序开始播放音乐,但当他们退出应用程序时,音乐会继续播放。
服务对于跨多个应用程序提供/管理对资源的公共访问也很有用。这通常用于系统资源,例如传感器。
广播接收器旨在响应意图(通常是由服务或系统事件发送的意图),做某事并完成。这里的示例可能是用户将支持NFC的手机触摸到标签,系统为其创建意图,并且注册的接收器处理它以更改某些设置(更改音量,打开蓝牙等)。
当通过sendBroadcast广播意图时,它将被发送到具有匹配意图过滤器的所有接收器。但是,重要的是要注意,在API26 +中,在此类情况下不再调用清单中注册的大多数接收者,请参阅the Google docs for more information。
示例1:假设您要公开一个函数(可从任何想要使用它的应用程序获得),要求网站计算与Kevin Bacon的分离程度。
请注意,此示例是“执行某些操作并返回”,而不是执行长时间运行的后台操作。
您可以通过多种方式实现此目的:
创建一个所有用户都可以编译到其应用程序中的库项目。
创建广播接收器以处理每个请求。
创建处理每个请求的服务
示例2:您希望执行一些数据分析以查找数据中的某些模式
后台线程如果在用户处于同一个应用程序和同一个Activity上时发生所有处理,则后台线程(或管理后台线程的AsyncTask)将是一个很好的方法< / p>
服务如果您希望允许用户在执行处理时退出应用程序(并在稍后通知他们结果),或允许他们在同一应用程序中执行多个活动在处理过程中,服务将是一种更好的方法
答案 1 :(得分:70)
广播接收器
引用Dianne Hackborn on the Android Developers blog:
处理广播时,应用程序会获得一组固定的时间(当前为10秒)来完成其工作。 如果它在那段时间内没有完成,那么应用程序被认为是行为不端,并且如果需要,它的进程会立即进入后台状态以便为内存被杀死。
广播接收器受最大时间限制(一般为10秒),必须完成。
<强>服务强>
如果您的行动需要更长的时间(连接到互联网可能会花费一些时间)。更像是在后台运行。你肯定应该从接收者或活动呼叫服务为此目的。它们最后被Android操作系统杀死。
结论:
一般来说,对您的应用程序很重要的所有工作(获取,解析,缓存,更新数据库)都应该移动到Service
,因为它们在Android上很长时间。正如您几乎认为所有社交网站都有STICKY_SERVICES
所做的所有繁琐的工作。
BroadcastReceiver
主要用于启动服务。它通常取决于应用。网络处于UP或DOWN时,大多数应用程序使用ConnectivityManager
进行广播。在这些Service
的帮助下,BroadcastReceiver
启动了
答案 2 :(得分:5)