2010-08-02 13 views
15

Nel mio app Android, chiamo sia startService e bindService:Devo chiamare sia unbindService che stopService per i servizi Android?

Intent intent = new Intent(this, MyService.class); 
ServiceConnection conn = new ServiceConnection() { ... } 

startService(intent) 
bindService(intent, conn, BIND_AUTO_CREATE); 

Più tardi, tento di entrambi unbindService and stopService`:

unbindService(conn); 
stopService(intent); 

Tuttavia, ottengo un'eccezione sulla chiamata a unbindService. Se rimuovo questa chiamata, l'app sembra funzionare correttamente tramite la chiamata stopService.

Sto facendo qualcosa di sbagliato? Ho pensato che una chiamata bindService doveva essere associata a una chiamata unbindService e una chiamata startService doveva essere associata a una chiamata stopService. Questo non sembra essere il caso qui, però.

+0

Lo hai mai capito? Mi sono imbattuto nella stessa cosa, e ho commentato l'unbindService (conn) per me stesso. Sembra funzionare bene, ma proprio come te, il mio istinto dice che qualcosa sullo sfondo non gli piacerebbe. –

risposta

24

La documentazione Android per StopService() afferma:

Si noti che se un servizio arrestato ha ancora oggetti ServiceConnection legati ad esso con il set BIND_AUTO_CREATE, non sarà distrutto fino a quando tutti questi attacchi sono stati rimossi. Consultare la documentazione del servizio per ulteriori dettagli sul ciclo di vita di un servizio.

Quindi chiamare stopService() prima seguito da unbindService() dovrebbe funzionare (funziona per me).

+1

Ahh, quindi sembra che il mio ordinamento di 'unbindService' e' stopService' fossero indietro, vedo. –

+0

Grazie, questo mi ha aiutato! Ho utilizzato BIND_AUTO_CREATE e unbindService() per risolvere il problema con la perdita ServiceConnection. – lomza

+0

@ Matt Huggins, quindi voi ragazzi intendete smettere prima e poi smettere? –

5

Come si può vedere here dipende da ciò che si desidera ottenere e come si associa il servizio. Se si desidera avere un riferimento lungo al servizio, è meglio usare bindService di startService. Se si utilizza il metodo bindService, viene utilizzato il flag BIND_AUTO_CREATE, quindi non è necessario chiamare startService, poiché il servizio viene avviato automaticamente quando necessario.

Se si chiama un servizio UnBind, l'associazione al servizio viene cancellata. Non devi interrompere esplicitamente il servizio, ma puoi farlo. Ma è importante notare che, se si chiama unBind(), il servizio può fermarsi in qualsiasi momento.

+1

Grazie, ma ci sono stato, e non è chiaro se ho bisogno di separare e interrompere il servizio se l'ho avviato manualmente prima di collegarlo con il flag BIND_AUTO_CREATE. –

8

Un Gotcha che mi ha colpito con questo:

Assicurarsi di chiamare unbindService sullo stesso contesto che hai chiamato bindService. Nel mio caso, stavo facendo la seguente per legarlo:

Context c = getApplicationContext(); 
c.bindService(...); 

Poi UNBIND, basta:

unbindService(...); 

assicurandosi che entrambi si legano e non associare utilizzato lo stesso contesto ha risolto il problema.

+1

grazie - sono appena stato incasinato da questo – SteelBytes

Problemi correlati