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

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


当前回答

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

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

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

IntentService的三个主要功能是:

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

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

其他回答

服务

通过startService()调用从任何线程触发在主线程上运行可能会阻塞主(UI)线程。对于长任务,始终在服务中使用线程任务完成后,我们有责任通过调用stopSelf()或stopService()来停止服务

Intent服务

它执行长任务,通常不与主线程通信,如果需要通信,则由处理器或BroadcastReceiver完成通过Intent调用从主线程触发在单独的线程上运行无法并行运行任务,并且多个意图在同一工作线程上排队。

Intent服务

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

适合同步、上传等…

服务

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

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

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

我相信你只需在谷歌上搜索诸如“Android IntentService vs Service”之类的内容,就能找到一系列不同之处

每个示例中一个更重要的区别是IntentService在完成后会自动结束。

一些例子(很快编好)可能是:;

IntentService:如果你想在打开应用程序时下载一堆图片。这是一个一次性的过程,一旦下载完所有内容,就可以自行清理。

服务:一种服务,它将不断用于通过web API调用在应用程序和后端之间进行通信。即使它完成了当前任务,您仍然希望它在几分钟后出现,以便进行更多的交流。

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

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

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

IntentService的三个主要功能是:

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

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

轮子

IntentService扩展了Service类,这显然意味着IntentService是为了相同的目的而故意创建的。

那么目的是什么呢?

`IntentService的目的是让我们的工作更容易运行后台任务,而不用担心

创建工作线程逐一排队处理多个请求(线程)破坏服务

所以不,Service可以完成IntentService所能完成的任何任务。如果您的需求符合上述标准,那么您不必在Service类中编写这些逻辑。所以不要再发明轮子,因为IntentService是发明的轮子。

“主要”区别

服务在UI线程上运行,而IntentService在单独的线程

你什么时候使用IntentService?

当您希望逐个执行超出“活动”范围的多个后台任务时,IntentService是完美的。

IntentService是如何从服务生成的

正常服务在UI线程上运行(默认情况下,任何Android组件类型都在UI线程中运行,例如Activity、BroadcastReceiver、ContentProvider和service)。如果你必须做一些可能需要一段时间才能完成的工作,那么你必须创建一个线程。在多个请求的情况下,您必须处理同步。IntentService提供了一些为您执行这些任务的默认实现。根据开发者页面

IntentService创建工作线程IntentService创建一个工作队列,将请求逐个发送到onHandleIntent()方法当没有工作时,IntentService调用stopSelf()方法为空的onBind()方法提供默认实现onStartCommand()的默认实现,它将Intent请求发送到WorkQueue,并最终发送到onHandleIntent()