Si j'ai le code suivant:
Intent intent = new Intent(this,DownloadService.class);
for(int i=0;i<filesArray.length;i++){
startService(intent);
}
Dans ce code DownloadService
s'étend IntentService
.
Alors maintenant, lorsque j'appelle, startService(intent)
cela signifie que je démarre un nouveau service à chaque fois que je suis startService(intent)
appelé ou cela signifie qu'il DownloadService
est exécuté une fois, puis chaque fois que j'appelle, startService(intent)
il passera simplement une intention différente avec un startId différent.
Cela a-t-il un sens, et lequel de ces éléments est le cas?
onCreate()
si le service est déjà créé). Il devrait être facile de déterminer si vous insérez unLog.i()
dans les deux rappels et vérifiez le LogCat.startService()
c'est asynchrone. Ainsi, pendant que vous bouclez les appels, le service lui-même n'a pas obtenu de ressources et n'a pas encore démarré.Absolument correct. Une seule instance de service est créée pour un processus d'application. Et lorsque vous appelez à
StartService();
nouveau, alors seulementonStartCommand()
est appelé et la nouvelle intention est transmise à laonStartCommand()
méthode.Remarque:
onCreate()
n'est pas rappelé.À propos des appels
bindService()
multiples:Lorsque vous appelez
bindService()
plusieurs fois, une seule instance est utilisée pour le service et Android Runtime renvoie le même objet IBinder au client.Signifie,
onBind()
n'est pas appelé plusieurs fois. Et juste l'objet IBinder mis en cache est retourné.la source
onStop()
-on appeler pour chaque correspondantonStartCommand
?L'ajout d'informations supplémentaires aux réponses ci-dessus qui peuvent être utiles pour d'autres est
startId
que laonStartCommand()
méthode reçue est différente pour chaquestartService()
appel.De plus, si nous écrivons dans la boucle for comme mentionné ci-dessus, le code écrit
onHandleIntent()
s'exécutera autant de fois que défini par la fréquence de la boucle for, mais en séquence et pas en parallèle.Le concept est de
IntentService
créer une file d'attente de travail et chaque demande destartService()
déclenchementonStartCommand()
qui stocke à son tour l'intention dans la file d'attente de travail, puis transmet l'intention une par une àonHandleIntent()
.la source
D'après le doc :
et
la source