我正在寻找一个可以用IntentService完成但不能用Service完成的示例(反之亦然)?

我还认为IntentService在不同的线程中运行,而Service则不运行。因此,就我所见,在自己的线程中启动服务就像启动IntentService一样。这是正确的吗?


当前回答

如果有人能向我展示一个可以用IntentService完成而不能用Service完成的事情的例子。

根据定义,这是不可能的。IntentService是服务的一个子类,用Java编写。因此,IntentService所做的任何事情,服务都可以通过包含IntentService使用的相关代码位来完成。

使用自己的线程启动服务就像启动IntentService。不是吗?

IntentService的三个主要功能是:

后台线程传递给onStartCommand()的Intent的自动排队,因此如果后台线程上的onHandleIntent()正在处理一个Intent,其他命令将排队等待一旦队列为空,通过调用stopSelf()自动关闭IntentService

所有这些都可以由服务实现,而无需扩展IntentService。

其他回答

Tejas Lagvankar就这个主题写了一篇很好的帖子。以下是Service和IntentService之间的一些关键区别。

何时使用?

该服务可以在没有UI的任务中使用,但不应该太长。如果需要执行长任务,则必须在Service中使用线程。IntentService可用于长任务,通常与主线程没有通信。如果需要通信,可以使用主线程处理程序或广播意图。另一种使用情况是需要回调(意图触发任务)。

如何触发?

通过调用方法startService()来触发服务。IntentService是使用Intent触发的,它生成一个新的工作线程,并在此线程上调用onHandleIntent()方法。

触发自

服务和IntentService可以从任何线程、活动或其他应用程序组件触发。

运行时间

服务在后台运行,但它在应用程序的主线程上运行。IntentService在单独的工作线程上运行。

限制/缺点

服务可能会阻止应用程序的主线程。IntentService无法并行运行任务。因此,所有连续的意图都将进入工作线程的消息队列,并按顺序执行。

何时停止?

如果您实现了一个服务,那么您有责任在服务完成后停止服务,方法是调用stopSelf()或stopService()。(如果您只想提供绑定,则不需要实现此方法)。IntentService在处理完所有启动请求后停止服务,因此您不必调用stopSelf()。

IntentService是服务的扩展,用于简化需要在后台和单独线程中执行的任务的执行。

IntentService启动,创建一个线程并在线程中运行其任务。一旦完成,它就会清洁一切。IntentService的一个实例只能同时运行,多个调用被排队。

它的使用非常简单,对于很多用途都非常方便,例如下载东西。但它有一些限制,可能会让你想使用更基本(不简单)的服务。

例如,连接到xmpp服务器并由活动绑定的服务不能简单地使用IntentService完成。您最终将忽略或覆盖IntentService内容。

服务和IntentService之间的主要区别如下:

服务:

1.默认情况下,服务在应用程序的主线程上运行。(这里没有默认的工作线程可用)。因此用户需要创建一个单独的线程,并在该线程中执行所需的工作。

2.一次允许多个请求。(多线程)

意向服务:

1.现在,来到IntentService,这里有一个默认的工作线程可以执行任何操作。注意-您需要实现onHandleIntent()方法,该方法接收每个启动请求的意图,在那里您可以执行后台工作。

2.但它一次只允许一个请求。

Intent服务

IntentService在自己的线程上运行。完成后,它会自动停止。更像是火和遗忘。后续呼叫将排队。很适合排队打电话。如果需要,您还可以在IntentService中旋转多个线程——您可以使用ThreadPoolExecutor实现这一点。我这么说是因为很多人问我“为什么要使用IntentService,因为它不支持并行执行”。IntentService只是一个线程。你可以在里面做任何你需要的事情-甚至可以旋转多个线程。唯一需要注意的是,IntentService在您旋转这些多个线程时立即完成。它不需要等待这些线程返回。你需要处理好这件事。因此,我建议在这些场景中使用ThreadPoolExecutor。

适合同步、上传等…

服务

默认情况下,服务在主线程上运行。你需要旋转一个工人线程来完成你的工作。您需要明确停止服务。我把它用于一种情况,当你需要在后台运行东西时,甚至当你离开你的应用程序,回来更多地使用无头服务时。

如果需要,也可以运行多个线程。可用于音乐播放器等应用程序。

如果需要,您可以随时使用BroadcastReceivers与您的活动进行通信。

如果有人能向我展示一个可以用IntentService完成而不能用Service完成的事情的例子。

根据定义,这是不可能的。IntentService是服务的一个子类,用Java编写。因此,IntentService所做的任何事情,服务都可以通过包含IntentService使用的相关代码位来完成。

使用自己的线程启动服务就像启动IntentService。不是吗?

IntentService的三个主要功能是:

后台线程传递给onStartCommand()的Intent的自动排队,因此如果后台线程上的onHandleIntent()正在处理一个Intent,其他命令将排队等待一旦队列为空,通过调用stopSelf()自动关闭IntentService

所有这些都可以由服务实现,而无需扩展IntentService。