2011-11-05 16 views
86

Se ho il seguente codice:Cosa succede se un servizio viene avviato più volte?

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

In questo codice DownloadService estende IntentService.

Così ora quando sto chiamando startService(intent) vuol dire che sto iniziando un nuovo servizio ogni volta che viene chiamato startService(intent) o Vuol dire che DownloadService viene eseguito una volta e poi ogni volta che chiamo startService(intent) sarà solo passare una diversa intento con un diverso ID iniziale.

Ha senso, e quale di questi è il caso?

risposta

123

Il servizio verrà eseguito solo in una istanza. Tuttavia, ogni volta che si avvia il servizio, viene chiamato il metodo onStartCommand().

Questo è documentato here

+1

Grazie. Inoltre, afferma: "Il metodo startService() restituisce immediatamente e il sistema Android chiama il metodo onStartCommand() del servizio.Se il servizio non è già in esecuzione, il sistema prima chiama onCreate(), quindi chiama onStartCommand()." Quindi se il servizio è già in esecuzione, il sistema salterà il metodo onCreate() e chiamerà solo onStartCommand() o cosa? – bytebiscuit

+0

Non lo so, ma sono abbastanza sicuro che sia il caso (fa un sacco di problemi a non chiamare "onCreate()" se il servizio è già stato creato). Dovrebbe essere facile determinare se si inserisce un 'Log.i()' in entrambi i callback e controllare il LogCat. –

+0

Ho appena fatto ... e stranamente inizia il onCreate dopo l'ultima chiamata startService() !!! – bytebiscuit

7

assolutamente corretto. Viene creata una sola istanza di Servizio per un processo di applicazione. E quando si chiama onStart(); di nuovo, quindi solo onStartCommand() viene chiamato e il nuovo Intent viene passato al metodo onStartCommand().

Nota: onCreate() non è chiamato di nuovo.

Chi chiama bindService() più volte:

Quando si chiama bindService() più volte, poi di nuovo una sola istanza viene utilizzato per il servizio e Android runtime restituisce stesso oggetto IBinder al cliente.

Mezzi, onBind() non viene chiamato più volte. E viene restituito solo l'oggetto IBinder memorizzato nella cache.

+0

'' onStop() 'deve essere chiamato per ogni corrispondente' onStartCommand'? –

+6

@IgorGanapolsky: Prima di tutto, non esiste un metodo di callback onStop() in Servizio. Abbiamo bisogno di chiamare stopService() o stopSelf() per interrompere un servizio. E quando onStartCommand() è stato chiamato più volte per più intenti, allora dobbiamo chiamare solo stopSelf() o stopService() solo una volta. Se si utilizza IntentService, è necessario chiamare stopSelfResult (int id) che passa l'id iniziale della richiesta da onHandleIntent(), che interromperà la richiesta id iniziale di avvio, che è stata inserita nella coda di lavoro di IntentService. Spero che questo ti aiuti. –

2

Aggiungere alcune ulteriori informazioni alle risposte precedenti che potrebbero essere utili per gli altri è che, startId che il metodo onStartCommand() riceve è diverso per ogni chiamata startService(). Anche se scriviamo in loop come sopra, il codice scritto in onHandleIntent() verrebbe eseguito tante volte come definito dalla frequenza for loop, ma in sequenza e non in parallelo. Il concetto è IntentService crea una coda di lavoro e ogni richiesta di startService() attiva onStartCommand() che a sua volta memorizza l'intento nella coda di lavoro e quindi passa l'intento uno per uno a onHandleIntent().

Problemi correlati