问题 Android:多个intentservices或一个具有多个意图的intentservice?


我对intentService有点困惑。文档说如果你发送一个intentService多个任务(意图),那么它将在一个单独的线程上一个接一个地执行它们。我的问题是 - 是否可以同时拥有多个intentService线程?如何区分在同一个intentService(同一个线程)上创建三个不同意图的代码,或者三个单独的intentServices,每个都有自己的线程和一个意图执行?

换句话说,当您执行命令startService(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);

11814
2018-06-13 17:00


起源



答案:


1)是否可以同时拥有多个intentService线程?

不,每个IntentService只有一个 HandlerThread 它用于按照调用“startService”的顺序执行请求。除非由于某种原因你决定在IntentService中产生你自己的线程/线程,但这可能会破坏首先使用IntentService的目的。同一清单声明的服务,即服务名称=“。MyIntentService”(这对于普通服务来说是相同的)在其进程中作为单例运行,因此在服务被终止之前,相同的服务将接收额外的启动请求。

2)如何在同一个IntentService上创建三个不同意图之间区分代码?

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


10
2018-06-13 17:05



是的,所有对startService的请求都将按照每个intent对象调用startService的顺序命中onHandleIntent()。所以,基本上你正在为Intent服务排队三个“工作”以队列方式运行。一旦onHandleIntent()完成运行/或被当前操作阻止,它将被你排队的下一个startService(Intent intent)请求命中。一旦所有“startService”作业完成,意图服务将自行关闭,因为它的底层Handler不再有“处理”消息。 - Submersed
@Jon打电话 startService(someIntent1) 两次,打电话 startService(someIntent2) 四次并加一些 Log.d 在每个里面 onHandleIntent 方法,你会看到它是如何工作的 - pskink
@Submersed:“怎么样?” - 通过创建多个子类 IntentService。 “第一个,如果已经在当前的应用程序进程中创建,将收到其他消息” - 仅用于 startService() 打电话给 Intent 识别出来 IntentService。每 IntentService 有它自己的 HandlerThread,而后者又有自己的 MessageQueue。而一个 个人  Service class实际上是一个单身人士, 分离  Service 班级有独立的生命周期,就像是分开的 Activity实例。他们都可以在一个过程中。 - CommonsWare
@Jon:“你的意思是说在同一个过程中可以有多个intentServices” - 是的,如果它们是单独的实现。在您的问题中,您似乎正在启动相同的服务(myIntentService)三次。这将创建一个服务实例,它将按顺序处理三个排队的命令。如果,OTOH,你有三个独立的 IntentService 子类(例如, myIntentService, myIntentService2, myIntentService3),你打电话 startService() 对每一个进行一次,它们将并行运行。 - CommonsWare
@CommonsWare是的,我也是。我进一步简化了,因为那部分并不是真正需要解决的问题,只是服务在他们的过程中是单身的事实 - 这实际上是我试图在那里说的。我现在有兴趣测试一些用例:) - Submersed


答案:


1)是否可以同时拥有多个intentService线程?

不,每个IntentService只有一个 HandlerThread 它用于按照调用“startService”的顺序执行请求。除非由于某种原因你决定在IntentService中产生你自己的线程/线程,但这可能会破坏首先使用IntentService的目的。同一清单声明的服务,即服务名称=“。MyIntentService”(这对于普通服务来说是相同的)在其进程中作为单例运行,因此在服务被终止之前,相同的服务将接收额外的启动请求。

2)如何在同一个IntentService上创建三个不同意图之间区分代码?

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


10
2018-06-13 17:05



是的,所有对startService的请求都将按照每个intent对象调用startService的顺序命中onHandleIntent()。所以,基本上你正在为Intent服务排队三个“工作”以队列方式运行。一旦onHandleIntent()完成运行/或被当前操作阻止,它将被你排队的下一个startService(Intent intent)请求命中。一旦所有“startService”作业完成,意图服务将自行关闭,因为它的底层Handler不再有“处理”消息。 - Submersed
@Jon打电话 startService(someIntent1) 两次,打电话 startService(someIntent2) 四次并加一些 Log.d 在每个里面 onHandleIntent 方法,你会看到它是如何工作的 - pskink
@Submersed:“怎么样?” - 通过创建多个子类 IntentService。 “第一个,如果已经在当前的应用程序进程中创建,将收到其他消息” - 仅用于 startService() 打电话给 Intent 识别出来 IntentService。每 IntentService 有它自己的 HandlerThread,而后者又有自己的 MessageQueue。而一个 个人  Service class实际上是一个单身人士, 分离  Service 班级有独立的生命周期,就像是分开的 Activity实例。他们都可以在一个过程中。 - CommonsWare
@Jon:“你的意思是说在同一个过程中可以有多个intentServices” - 是的,如果它们是单独的实现。在您的问题中,您似乎正在启动相同的服务(myIntentService)三次。这将创建一个服务实例,它将按顺序处理三个排队的命令。如果,OTOH,你有三个独立的 IntentService 子类(例如, myIntentService, myIntentService2, myIntentService3),你打电话 startService() 对每一个进行一次,它们将并行运行。 - CommonsWare
@CommonsWare是的,我也是。我进一步简化了,因为那部分并不是真正需要解决的问题,只是服务在他们的过程中是单身的事实 - 这实际上是我试图在那里说的。我现在有兴趣测试一些用例:) - Submersed