如果我有以下代码:
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传递不同的意图。
这是否有意义,以及其中哪一个是这样的?
答案 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)
时,您传递开始请求的 ID(startId 传递到 onStartCommand()
),您的停止请求对应。然后,如果服务在您能够调用 stopSelf(int) 之前收到新的启动请求,则 ID 不匹配并且服务不会停止。