Se eu tiver o seguinte código:
Intent intent = new Intent(this,DownloadService.class);
for(int i=0;i<filesArray.length;i++){
startService(intent);
}
Neste código DownloadService
estende IntentService
.
Então, agora, quando estou chamando startService(intent)
, isso significa que estou iniciando um novo serviço toda vez que startService(intent)
é chamado ou significa que DownloadService
é executado uma vez e, a cada vez que o chamo startService(intent)
, passará um intent diferente com um startId diferente.
Isso faz sentido, e qual é o caso?
onCreate()
se o serviço já estiver criado). Deve ser fácil determinar se você colocou umLog.i()
em ambos os callbacks e verificou o LogCat.startService()
é assíncrono. Portanto, enquanto você está fazendo o loop das chamadas, o serviço em si não obteve nenhum recurso e ainda não foi iniciado.Absolutamente correto. Apenas uma instância de serviço é criada para um processo de aplicativo. E quando você chama
StartService();
novamente, então apenasonStartCommand()
é chamado e um novo Intent é passado para oonStartCommand()
método.Nota:
onCreate()
não é chamado novamente.Sobre ligar
bindService()
várias vezes:Quando você chama
bindService()
várias vezes, novamente apenas uma instância é usada para o serviço e o Android Runtime retorna o mesmo objeto IBinder para o cliente.Significa,
onBind()
não é chamado várias vezes. E apenas o objeto IBinder em cache é retornado.fonte
onStop()
que ser chamado para cada correspondenteonStartCommand
?Adicionando mais algumas informações às respostas acima, o que pode ser útil para outras pessoas, é
startId
que oonStartCommand()
método recebido é diferente para cadastartService()
chamada.Além disso, se escrevermos no loop for conforme mencionado acima, o código escrito
onHandleIntent()
seria executado tantas vezes conforme definido pela frequência do loop for, mas em sequência e não em paralelo.O conceito é
IntentService
criar uma fila de trabalho e cada solicitação destartService()
acionamentoonStartCommand()
que, por sua vez, armazena o intent na fila de trabalho e, em seguida, passa o intent um por um paraonHandleIntent()
.fonte
De acordo com o doc :
e
fonte