2010-08-02 17 views
15

En mi aplicación para Android, me llaman tanto startService y bindService:¿Debo llamar tanto a unbindService como a StopService para servicios de Android?

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

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

Más tarde, intento tanto unbindService and stopService`:

unbindService(conn); 
stopService(intent); 

Sin embargo, me sale una excepción en la llamada a unbindService. Si elimino esta llamada, la aplicación parece ejecutarse correctamente a través de la llamada stopService.

¿Estoy haciendo algo mal? Pensé que una llamada bindService tenía que asociarse con una llamada unbindService, y una llamada startService tuvo que asociarse con una llamada stopService. Sin embargo, este no parece ser el caso aquí.

+0

¿Alguna vez descubrió esto? Me encontré con lo mismo, y comenté el unbindService (conn) para mí. Parece que funciona bien, pero al igual que tú, mi instinto me dice que algo en el fondo no me gustaría. –

Respuesta

24

La documentación Android stopService() afirma:

Tenga en cuenta que si un servicio detenido todavía tiene objetos ServiceConnection ligados a ella con el conjunto BIND_AUTO_CREATE, no será destruido hasta que todos estos enlaces se eliminan. Consulte la documentación del Servicio para obtener más detalles sobre el ciclo de vida de un servicio.

Por lo tanto, llamar a stopService() primero seguido de unbindService() debería funcionar (me funciona).

+1

Ahh, así que parece que mi pedido de 'unbindService' y' stopService' fue al revés, ya veo. –

+0

¡Gracias, esto me ayudó! Hice que BIND_AUTO_CREATE se usara y unbindService() ayudó a resolver el problema con la fuga de ServiceConnection. – lomza

+0

@Matt Huggins por lo que ustedes quieren desvincular primero y luego dejar de hacerlo ¿verdad? –

5

Como puede ver here, depende de lo que desee lograr y de cómo se vincula el servicio. Si desea tener una referencia de larga duración del servicio, es mejor usar bindService que startService. Si en el método bindService, se utiliza el indicador BIND_AUTO_CREATE, no es necesario llamar a startService, porque el servicio se inicia solo cuando es necesario.

Si llama al servicio de desvinculación, significa que se borra la asociación al servicio. No tienes que detener el servicio explícitamente, pero puedes hacerlo. Pero es importante tener en cuenta que si llama a unBind(), entonces el servicio puede detenerse en cualquier momento.

+1

Gracias, pero he estado allí, y no está claro si debo desvincularme y detener el servicio si lo inicio manualmente antes de vincularlo con el indicador BIND_AUTO_CREATE. –

8

Gotcha que me golpeó con esto:

Asegúrese de llamar unbindService en el mismo contexto que llamó bindService. En mi caso, yo estaba haciendo lo siguiente para obligar a éste:

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

Luego de desvincularla, simplemente:

unbindService(...); 

Asegurarse de que ambos se unen y Unbind utiliza el mismo contexto resolvió el problema.

+1

gracias - acabo de tropezar con esto – SteelBytes

Cuestiones relacionadas