Android:多个意图服务或一个具有多个意图的意图服务?

Posted

技术标签:

【中文标题】Android:多个意图服务或一个具有多个意图的意图服务?【英文标题】:Android: multiple intentservices or one intentservice with multiple intents? 【发布时间】:2016-10-14 04:50:27 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

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

以上是关于Android:多个意图服务或一个具有多个意图的意图服务?的主要内容,如果未能解决你的问题,请参考以下文章

具有多个选项的 Android 意图,即从图库中选择图像并使用前置摄像头捕获图像

3.5 意图Intent的概念

使用具有目的为“ android.rfid.INPUT”的意图的sendBroadcast

使用具有不同活动和最终电子邮件意图的多个意图

如何生成具有相同意图但具有另一个 Extra 的多个按钮

具有相同意图的推送通知打开 Activity