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