Jeśli mam następujący kod:
Intent intent = new Intent(this,DownloadService.class);
for(int i=0;i<filesArray.length;i++){
startService(intent);
}
W tym kodzie DownloadService
rozszerza IntentService
.
Więc teraz, kiedy dzwonię startService(intent)
, oznacza to, że uruchamiam nową usługę za każdym razem, gdy startService(intent)
jest wywoływana, lub oznacza to, że DownloadService
jest uruchamiana raz, a następnie za każdym razem, gdy dzwonię startService(intent)
, po prostu przejdzie inną intencję z innym startId.
Czy to ma sens i który z nich ma miejsce?
onCreate()
jeśli usługa jest już utworzona). Powinno być łatwe do ustalenia, czy umieścisz aLog.i()
w obu wywołaniach zwrotnych i sprawdzisz LogCat.startService()
jest asynchroniczny. Więc gdy zapętlasz połączenia, sama usługa nie uzyskała żadnych zasobów i jeszcze się nie uruchomiła.Absolutnie poprawne. Dla procesu aplikacji tworzona jest tylko jedna instancja usługi. A kiedy zadzwonisz
StartService();
ponownie,onStartCommand()
zostanie wywołany i nowy Intent jest przekazywany doonStartCommand()
metody.Uwaga:
onCreate()
nie jest ponownie wywoływany.Informacje o
bindService()
wielokrotnym dzwonieniu :Gdy wywołujesz
bindService()
wiele razy, ponownie tylko jedno wystąpienie jest używane dla usługi, a środowisko wykonawcze systemu Android zwraca ten sam obiekt IBinder do klienta.Znaczy,
onBind()
nie jest wywoływany wielokrotnie. Zwracany jest tylko obiekt IBinder z pamięci podręcznej.źródło
onStop()
trzeba wywołać każdą korespondencjęonStartCommand
?Dodanie dodatkowych informacji do powyższych odpowiedzi, które mogą być pomocne dla innych, polega na tym,
startId
żeonStartCommand()
metoda odbiera jest inna dla każdegostartService()
połączenia.Również, jeśli napiszemy pętlę for, jak wspomniano powyżej, kod napisany w programie
onHandleIntent()
będzie wykonywał się tyle razy, ile jest zdefiniowane przez częstotliwość pętli for, ale sekwencyjnie, a nie równolegle.Koncepcja polega na
IntentService
utworzeniu kolejki roboczej i każdym żądaniustartService()
wyzwalania,onStartCommand()
które z kolei przechowuje intencję w kolejce roboczej, a następnie przekazuje intencję jeden po drugimonHandleIntent()
.źródło
Według doc :
i
źródło