"Se avvii un servizio Android con startService(..)
quel servizio rimarrà in esecuzione finché non lo stopService(..)
inviti esplicitamente . Ci sono due ragioni per cui un servizio può essere eseguito dal sistema. Se qualcuno chiama, Context.startService()
il sistema recupererà il servizio (creandolo e chiamando il suo onCreate()
metodo se necessario) e quindi chiamare il suo onStartCommand(Intent, int, int)
metodo con gli argomenti forniti dal client. A questo punto il servizio continuerà a funzionare fino a quando non viene chiamato Context.stopService()
o stopSelf()
. Si noti che più chiamate a Context.startService()
non vengono nidificate (sebbene risultino in più chiamate corrispondenti a onStartCommand()
), quindi no importa quante volte viene avviato un servizio verrà arrestato una volta Context.stopService()
o stopSelf()
viene chiamato; tuttavia, i servizi possono utilizzare il lorostopSelf(int)
per garantire che il servizio non venga arrestato finché gli intenti avviati non sono stati elaborati.
I client possono anche utilizzare Context.bindService()
per ottenere una connessione permanente a un servizio. Allo stesso modo questo crea il servizio se non è già in esecuzione (chiamando onCreate()
mentre lo fa), ma non chiama onStartCommand()
. Il client riceverà l' IBinder
oggetto che il servizio restituisce dal suo onBind(Intent)
metodo, consentendo al client di effettuare chiamate di nuovo al servizio. Il servizio rimarrà in esecuzione fintanto che viene stabilita la connessione (indipendentemente dal fatto che il client mantenga o meno un riferimento sul servizio IBinder
). Di solito il risultato IBinder
è per un'interfaccia complessa che è stata scritta in AIDL.
Un servizio può essere avviato e avere connessioni ad esso associate. In tal caso, il sistema manterrà il servizio in esecuzione fintanto che viene avviato o vi sono una o più connessioni ad esso con il Context.BIND_AUTO_CREATE
flag. Quando nessuna di queste situazioni si verifica, onDestroy()
viene chiamato il metodo del servizio e il servizio viene effettivamente terminato. Tutta la pulizia (arresto dei thread, annullamento della registrazione dei ricevitori) dovrebbe essere completata al ritorno da onDestroy()
. "