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

如果Android服务启动多次会发生什么?,android,Android,如果我有以下代码: Intent intent = new Intent(this,DownloadService.class); for(int i=0;i<filesArray.length;i++){ startService(intent); } Intent Intent=newintent(这是DownloadService.class); 对于(int i=0;i该服务将仅在一个实例中运行。但是,每次启动该服务时,都会

如果我有以下代码:

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

对于(int i=0;i该服务将仅在一个实例中运行。但是,每次启动该服务时,都会调用
onStartCommand()
方法

这是记录在案的

绝对正确。 仅为应用程序进程创建一个服务实例。 当您再次调用
StartService();
时,只调用
onStartCommand()
,并将新的意图传递给
onStartCommand()
方法

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

关于多次调用
bindService()

当您多次调用
bindService()
时,同样只有一个实例用于服务,Android运行时会将相同的IBinder对象返回给客户端


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

在上述答案中添加一些可能对其他人有用的更多信息是,
onStartCommand()
方法接收到的
startService()
调用不同

同样,如果我们像上面提到的那样写入for循环,那么在
onHandleIntent()
中写入的代码将按照for循环频率的定义执行很多次,但顺序执行,而不是并行执行

这一概念是
IntentService
创建一个工作队列,每个对
startService()
的请求触发
onStartCommand()
,然后将意图存储在工作队列中,然后根据以下规则将意图逐个传递给
onHandleIntent()

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

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


非常有用的评论来自:

(我强调)

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


谢谢。上面还说:“startService()方法立即返回,Android系统调用服务的onStartCommand()方法。如果服务尚未运行,系统将首先调用onCreate(),然后调用onStartCommand()。”因此,如果服务已在运行,系统将跳过onCreate()方法并仅调用onStartCommand()还是什么?我真的不知道,但我非常确定情况是这样的(如果服务已经创建,最好不要调用
onCreate()
)。应该很容易确定是否放置
Log.I()
在两个回调中,并检查日志。刚刚这样做了……奇怪的是,它在最后一次startService()调用后启动onCreate!!!这是因为
startService()是异步的。因此,当您循环调用时,服务本身没有获得任何资源,也没有立即启动。@neelab不是“立即”启动的,启动服务需要一些时间,“for”循环仍然在运行,并且会一次又一次地调用服务,因此第一次尝试时不会发现任何服务正在运行…因此方法startService()会被调用几次,直到服务启动完成。请原谅我的英语不好。Does
onStop()
必须为每个对应的
onStartCommand
?@IgorGanapolsky:首先,服务中没有这样的回调方法onStop()。我们需要调用stopService()或stopSelf()来停止服务。当onStartCommand()被多次调用以实现多个目的时,我们只需要调用stopSelf()或stopService()仅一次。如果使用IntentService,您应该调用stopSelfResult(int id),从onHandleIntent()传递请求的开始id,这将停止放置在IntentService工作队列中的相应开始id请求。希望这有帮助。