Que se passe-t-il si un service est démarré plusieurs fois?

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 étend IntentService .

Alors maintenant, quand j’appelle startService(intent) cela signifie-t-il que je startService(intent) un nouveau service chaque fois que startService(intent) est appelé ou cela signifie-t-il que DownloadService est exécuté une fois, puis chaque fois que j’appelle startService(intent) passera juste une intention différente avec un startId différent.

Est-ce que cela a du sens, et lequel est le cas?

Le service ne fonctionnera que dans une instance. Cependant, chaque fois que vous démarrez le service, la méthode onStartCommand() est appelée.

Ceci est documenté ici

Absolument correct. Une seule instance de service est créée pour un processus d’application. Et quand vous appelez onStart (); à nouveau, seul onStartCommand () est appelé et un nouvel Intent est passé à la méthode onStartCommand ().

Remarque: onCreate () n’est plus appelé.

A propos de l’appel de bindService () plusieurs fois:

Lorsque vous appelez plusieurs fois bindService (), une seule instance est utilisée pour Service et Android Runtime renvoie le même object IBinder au client.

Moyens, onBind () n’est pas appelé plusieurs fois. Et juste un object IBinder mis en cache est retourné.

Ajouter des informations supplémentaires aux réponses ci-dessus, ce qui peut être utile pour les autres, est que startId que reçoit la méthode onStartCommand() est différent pour chaque appel startService() .

Aussi, si nous écrivons pour la boucle comme mentionné ci-dessus, le code écrit dans onHandleIntent() s’exécuterait autant de fois que défini par la fréquence de la boucle for, mais en séquence et non en parallèle.

Le concept est que IntentService crée une queue de travail et que chaque demande à startService() déclenche onStartCommand() qui à son tour stocke l’intention dans la queue de travail, puis transmet l’intention à onHandleIntent() .