Ответ 1
Служба будет работать только в одном экземпляре. Однако при каждом запуске службы вызывается метод onStartCommand()
.
Это описано здесь
Если у меня есть следующий код:
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.
Имеет ли это смысл, и какой из них имеет место?
Служба будет работать только в одном экземпляре. Однако при каждом запуске службы вызывается метод onStartCommand()
.
Это описано здесь
Совершенно верно.
Только один экземпляр службы создается для процесса приложения.
И когда вы снова вызываете StartService();
, тогда вызывается только onStartCommand()
и новое намерение передается методу onStartCommand()
.
Примечание. onCreate()
больше не вызывается.
О вызове bindService()
несколько раз:
Когда вы вызываете bindService()
несколько раз, то снова для службы используется только один экземпляр, и Android Runtime возвращает один и тот же объект IBinder клиенту.
Значит, onBind()
не вызывается несколько раз. И только что кэшированный объект IBinder возвращается.
Добавление большего количества некоторой информации вышеуказанных ответов, которые могут быть полезны для других является то, что, startId
что onStartCommand()
метод получает отличается для каждого startService()
вызова.
Также, если мы запишем цикл for, как упомянуто выше, код, написанный в onHandleIntent()
будет выполняться столько раз, сколько определено частотой цикла for, но последовательно, а не параллельно.
Идея заключается в том, что IntentService
создает рабочую очередь, и каждый запрос к startService()
вызывает onStartCommand()
который, в свою очередь, сохраняет намерение в рабочей очереди, а затем передает его по очереди в onHandleIntent()
.
Согласно документу:
Метод startService() немедленно возвращается, и система Android вызывает метод onStartCommand() службы. Если служба еще не запущена, система сначала вызывает onCreate(), а затем вызывает onStartCommand().
а также
Множественные запросы на запуск службы приводят к нескольким соответствующим вызовам службы onStartCommand(). Однако для его остановки требуется только один запрос на остановку службы (с помощью stopSelf() или stopService()).