Si tengo el siguiente código:
Intent intent = new Intent(this,DownloadService.class);
for(int i=0;i<filesArray.length;i++){
startService(intent);
}
En este código se DownloadService
extiende IntentService
.
Entonces, ahora, cuando llamo, startService(intent)
¿eso significa que estoy comenzando un nuevo servicio cada vez que startService(intent)
se llama o eso significa que DownloadService
se ejecuta una vez y luego, cada vez que llamo startService(intent)
, simplemente pasará una intención diferente con un startId diferente?
¿Tiene esto sentido y cuál de estos es el caso?
onCreate()
si el servicio ya está creado). Debería ser fácil determinar si coloca unaLog.i()
en ambas devoluciones de llamada y verifica el LogCat.startService()
es asincrónico. Entonces, mientras está repitiendo las llamadas, el servicio en sí no ha recibido ningún recurso y aún no ha comenzado.Absolutamente correcto. Solo se crea una instancia de Servicio para un proceso de solicitud. Y cuando vuelves a llamar
StartService();
, soloonStartCommand()
se llama y se pasa un nuevo Intent alonStartCommand()
método.Nota:
onCreate()
no se vuelve a llamar.Acerca de llamar
bindService()
varias veces:Cuando llamas
bindService()
varias veces, solo se usa una instancia para el servicio y Android Runtime devuelve el mismo objeto IBinder al cliente.Significa,
onBind()
no se llama varias veces. Y se devuelve el objeto IBinder en caché.fuente
onStop()
Tiene que ser llamado para cada correspondenciaonStartCommand
?Agregar más información a las respuestas anteriores que puede ser útil para otros es
startId
que elonStartCommand()
método que recibe es diferente para cadastartService()
llamada.Además, si escribimos el bucle for como se mencionó anteriormente, el código escrito
onHandleIntent()
se ejecutaría tantas veces como lo define la frecuencia del bucle for, pero en secuencia y no en paralelo.El concepto es
IntentService
crear una cola de trabajo y cada solicitud destartService()
activación,onStartCommand()
que a su vez almacena la intención en la cola de trabajo y luego pasa la intención una por unaonHandleIntent()
.fuente
Según el doc :
y
fuente