Android:多个意向服务还是一个包含多个意向的意向服务?

Android:多个意向服务还是一个包含多个意向的意向服务?,android,multithreading,android-service,android-intentservice,worker-thread,Android,Multithreading,Android Service,Android Intentservice,Worker Thread,我对intentService有点困惑。文档说,如果您发送一个intentService多个任务(intent),那么它将在一个单独的线程上逐个执行这些任务。我的问题是-是否可能同时有多个intentService线程?在代码中,您如何区分在同一intentService(同一线程)上创建三个不同的意图,还是在三个单独的intentService(每个intentService都有自己的线程和一个要执行的意图)上创建三个不同的意图 换句话说,当您执行startService(intent)命令时

我对intentService有点困惑。文档说,如果您发送一个intentService多个任务(intent),那么它将在一个单独的线程上逐个执行这些任务。我的问题是-是否可能同时有多个intentService线程?在代码中,您如何区分在同一intentService(同一线程)上创建三个不同的意图,还是在三个单独的intentService(每个intentService都有自己的线程和一个要执行的意图)上创建三个不同的意图

换句话说,当您执行startService(intent)命令时,是将intent放在单个队列中,还是每次都启动一个新队列

Intent someIntent1 = new Intent(this, myIntentService.class);
Intent someIntent2 = new Intent(this, myIntentService.class);
Intent someIntent3 = new Intent(this, myIntentService.class);
startService(someIntent1);
startService(someIntent2);
startService(someIntent3);
1)是否可以同时拥有多个intentService线程?

不,每个IntentService只有一个用于按照调用“startService”的顺序执行请求的服务。除非出于某种原因,您决定在IntentService中生成自己的线程,但这可能会首先破坏使用IntentService的目的。具有相同清单声明的服务,即service name=“.MyIntentService”(这与普通服务相同)在其进程中作为单例运行,因此在终止该服务之前,相同的服务将接收额外的启动请求

2)在代码中,您如何区分在同一IntentService上创建三个不同的意图?


要区分请求,请按预期使用Intent系统!为服务可以执行的不同作业提供不同的“操作”,并将IntentService为该特定作业正确运行所需的任何额外内容作为启动服务所用的Intent对象中的额外内容传递。

是的,所有对startService的请求都将命中onHandleIntent()按照每个intent对象调用startService的顺序。因此,基本上,您正在排队等待三个“作业”,以便意向服务以队列方式运行。一旦onHandleIntent()完成运行/或被当前操作阻止,它将被您排队的下一个startService(Intent)请求击中。一旦所有的“startService”作业完成,intent服务将自动关闭,因为它的底层处理程序不再需要“处理”消息。@Jon call
startService(someIntent1)
两次,调用
startService(someIntent2)
四次,在每个
onHandleIntent
方法中添加一些
Log.d
,您将看到它是如何运行的works@Submersed:“如何?”--通过创建
IntentService
的多个子类。“第一个,如果已在当前应用程序进程中创建,则将接收其他消息”--仅适用于
startService()
具有
Intent
标识该
IntentService
的调用。每个
IntentService
都有自己的
HandlerThread
,而HandlerThread又有自己的
MessageQueue
。虽然单个
服务
类实际上是一个单例,但独立的
服务
类具有独立的生命周期,就像独立的
活动
实例一样。它们都可以在一个进程中。@Jon:“你是说在同一个进程中可以有多个IntentService吗?”——是的,如果它们是单独的实现。在您的问题中,您似乎启动了相同的服务(
myIntentService
)三次。这将创建服务的一个实例,该实例将按顺序处理三个排队的命令。如果您有三个独立的
IntentService
子类(例如,
myIntentService
myIntentService 2
myIntentService 3
),并且您对每个子类调用
startService()
,它们将并行运行。@commonware是的,我也是。我进一步简化了,因为这一部分对于理解这一点并不是必需的,只是服务在其流程中是单例的事实——这就是我在这里想要说的。不过,我现在有兴趣测试一些用例:)