Что произойдет, если служба Android будет запущена несколько раз?

Если у меня есть следующий код:

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

В этом коде DownloadService продолжается IntentService.

Итак, теперь, когда я вызываю startService(intent), это означает, что я запускаю новый сервис каждый раз, когда вызывается startService(intent) или это означает, что DownloadService запускается один раз, а затем каждый раз, когда я вызываю startService(intent) он будет просто отличаться от другого с помощью startId.

Имеет ли это смысл, и какой из них имеет место?

Ответ 1

Служба будет работать только в одном экземпляре. Однако при каждом запуске службы вызывается метод onStartCommand().

Это описано здесь

Ответ 2

Совершенно верно. Только один экземпляр службы создается для процесса приложения. И когда вы снова вызываете StartService();, тогда вызывается только onStartCommand() и новое намерение передается методу onStartCommand().

Примечание. onCreate() больше не вызывается.

О вызове bindService() несколько раз:

Когда вы вызываете bindService() несколько раз, то снова для службы используется только один экземпляр, и Android Runtime возвращает один и тот же объект IBinder клиенту.

Значит, onBind() не вызывается несколько раз. И только что кэшированный объект IBinder возвращается.

Ответ 3

Добавление большего количества некоторой информации вышеуказанных ответов, которые могут быть полезны для других является то, что, startId что onStartCommand() метод получает отличается для каждого startService() вызова.

Также, если мы запишем цикл for, как упомянуто выше, код, написанный в onHandleIntent() будет выполняться столько раз, сколько определено частотой цикла for, но последовательно, а не параллельно.

Идея заключается в том, что IntentService создает рабочую очередь, и каждый запрос к startService() вызывает onStartCommand() который, в свою очередь, сохраняет намерение в рабочей очереди, а затем передает его по очереди в onHandleIntent().

Ответ 4

Согласно документу:

Метод startService() немедленно возвращается, и система Android вызывает метод onStartCommand() службы. Если служба еще не запущена, система сначала вызывает onCreate(), а затем вызывает onStartCommand().

а также

Множественные запросы на запуск службы приводят к нескольким соответствующим вызовам службы onStartCommand(). Однако для его остановки требуется только один запрос на остановку службы (с помощью stopSelf() или stopService()).