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