如果多次启动服务会发生什么?

时间:2011-11-05 11:32:38

标签: android

如果我有以下代码:

Intent intent = new Intent(this,DownloadService.class);     
for(int i=0;i<filesArray.length;i++){        
     startService(intent);          
}

在此代码中,DownloadService扩展了IntentService

所以现在当我调用startService(intent)时,这意味着我每次调用startService(intent)时都会启动新服务,或者这是否意味着DownloadService运行一次然后每次我调用startService(intent)时,它只会使用不同的startId传递不同的意图。

这是否有意义,以及其中哪一个是这样的?

5 个答案:

答案 0 :(得分:146)

服务只能在一个实例中运行。但是,每次启动服务时,都会调用onStartCommand()方法。

记录在案here

答案 1 :(得分:13)

绝对正确。 仅为应用程序进程创建一个Service实例。 当你调用onStart();再次,然后只调用onStartCommand()并将新的Intent传递给onStartCommand()方法。

注意: onCreate()不会再次调用。

关于多次调用bindService():

当您多次调用bindService()时,再次只有一个实例用于Service,Android Runtime将同一个IBinder对象返回给客户端。

意味着,onBind()不会被多次调用。然后返回缓存的IBinder对象。

答案 2 :(得分:5)

在上述答案中添加一些可能对其他人有帮助的信息是,startId方法收到的onStartCommand()对于每个startService()调用都不同。

如果我们如上所述写入for循环,用onHandleIntent()编写的代码将执行for循环频率定义的那么多次,但是按顺序而不是并行执行。

概念是IntentService创建工作队列,每个请求startService()触发onStartCommand(),然后将意图存储在工作队列中,然后将意图逐个传递给{{ 1}}。

答案 3 :(得分:0)

根据doc

  

startService()方法立即返回,并且Android系统调用服务的onStartCommand()方法。如果该服务尚未运行,则系统首先调用onCreate(),然后调用onStartCommand()。

  

启动服务的多个请求导致对该服务的onStartCommand()的多个相应调用。但是,只需一个停止服务的请求(使用stopSelf()或stopService())即可停止它。

答案 4 :(得分:0)

来自 Android official docs 的非常有用的评论:

(由我突出显示)

<块引用>

如果您的服务同时处理多个onStartCommand()的请求,您在处理完启动请求后不应停止该服务,因为您可能收到了一个新的开始请求(在第一个请求结束时停止将终止第二个请求)。为避免此问题,您可以使用 stopSelf(int) 来确保停止服务的请求始终基于最近的启动请求。也就是说,当您调用 stopSelf(int) 时,您传递开始请求的 IDstartId 传递到 onStartCommand()),您的停止请求对应。然后,如果服务在您能够调用 stopSelf(int) 之前收到新的启动请求,则 ID 不匹配并且服务不会停止。