Android广播接收器与服务

Android广播接收器与服务,android,android-service,android-broadcast,Android,Android Service,Android Broadcast,我试图澄清android中广播接收器和服务之间的区别 我知道活动可以通过有目的地调用startService来启动服务 广播接收器可以在代码或清单中注册,并可以使用sendBroadcast调用 您什么时候会使用其中一种与另一种? 我知道多个广播接收器可以出于相同的目的收听节目,但一个服务的情况并非如此。服务的目的是在后台执行一段时间的动作,而不管用户在前台做什么(用户可以在活动之间切换)。一个很好的例子是音乐播放器服务——用户开始通过音乐播放器应用程序播放音乐,但当他们退出应用程序时,音乐仍在

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

我知道活动可以通过有目的地调用
startService
来启动服务

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

您什么时候会使用其中一种与另一种?


我知道多个广播接收器可以出于相同的目的收听节目,但一个服务的情况并非如此。

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

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

广播接收器用于响应意图(通常是由服务或系统事件发送的意图),做一些事情,然后完成。这里的一个例子可能是,用户将支持NFC的手机触碰到标签上,系统为其创建一个意图,注册的接收器处理该意图以更改某些设置(更改音量、打开蓝牙等)

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


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

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

您可以通过多种方式实现这一点:

创建一个库项目,供所有用户编译到他们的应用程序中。

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

  • 您的应用程序注册一个广播接收器以接受询问问题的意图
  • 每个应用程序都发送一个询问问题的意图
  • 广播接收器接受该意图,并且
    • 将请求传递给服务进行处理,服务将向请求者发送一个意图和结果
    • 向服务器发送请求,完成后服务器将使用谷歌云消息进行响应
  • 因为所有请求都通过一个应用程序,所以可以批处理/缓存结果
  • 这总是异步的
  • API是“意图”——不是公开功能的最友好的方式
创建一个服务来处理每个请求

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

示例2:您希望执行一些数据分析,以在数据中找到一些模式

后台线程如果所有处理都应该在用户处于同一应用程序中且处于同一活动中时进行,那么后台线程(或管理后台线程的异步任务)将是一种很好的方法


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

广播接收器

引述:

在处理广播时,应用程序将获得一组固定的时间(当前为10秒)来执行其工作。 如果没有在这段时间内完成,应用程序将被视为行为异常,其进程将立即进入后台状态,以便在需要时为内存而终止

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

服务

如果您的操作需要更长的时间(连接到internet可能需要一些时间)。更喜欢在后台运行。为此,您绝对应该从接收者或活动处呼叫服务。他们是最后一个被android操作系统杀死的人

结论:

  • 一般来说,所有对应用程序很重要的工作(抓取、解析、缓存、更新数据库)都应该转移到
    Service
    ,因为它们在Android上已经存在很长时间了。你几乎已经考虑过了,所有的社交网站都有
    粘性服务
    ,这些服务可以完成所有麻烦的工作

  • BroadcastReceiver
    主要用于启动服务。它通常取决于应用。大多数应用程序使用
    ConnectivityManager
    在网络启动或关闭时进行广播。借助这些
    服务
    广播接收器
    启动


  • 首先,阅读和的文档

    您可以找到有用的教程和

    最后,长话短说:

    根据您的要求开始服务(st