start - communicate service with activity android
¿Debo llamar a los servicios unbindService y stopService para Android? (3)
Como puede ver here , depende de lo que desee lograr y de cómo vincular el servicio. Si desea tener una referencia prolongada al servicio, es mejor usar bindService que startService. Si en el método bindService, se usa el indicador BIND_AUTO_CREATE, entonces no tiene que llamar a startService, porque el servicio se inicia solo cuando es necesario.
Si llama al servicio de desvinculación, se eliminará la asociación al servicio. No tiene que detener explícitamente el servicio, pero puede hacerlo. Pero es importante tener en cuenta que si llama a unBind (), entonces el servicio puede detenerse en cualquier momento.
En mi aplicación de Android, llamo a startService
y a bindService
:
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, recibo una excepción en la llamada a unbindService
. Si stopService
esta llamada, la aplicación parece funcionar correctamente a través de la llamada stopService
.
¿Estoy haciendo algo mal? Pensé que una llamada bindService
tenía que estar asociada con una llamada unbindService
, y una llamada startService
tenía que estar asociada con una llamada stopService
. Sin embargo, este no parece ser el caso aquí.
La documentación de Android para stopService () establece:
Tenga en cuenta que si un servicio detenido aún tiene objetos ServiceConnection vinculados a él con el conjunto BIND_AUTO_CREATE, no se destruirá hasta que se eliminen todos estos enlaces. Consulte la documentación del Servicio para obtener más detalles sobre el ciclo de vida de un servicio.
Así que llamar a stopService()
primero seguido por unbindService()
debería funcionar (a mí me funciona).
Un gotcha que golpeé con esto:
Asegúrese de llamar a unbindService en el mismo contexto que llamó bindService. En mi caso, estaba haciendo lo siguiente para atarlo:
Context c = getApplicationContext();
c.bindService(...);
Entonces para desenlazarlo, simplemente:
unbindService(...);
Asegurarse de que tanto el enlace como el desvinculación utilizaron el mismo contexto resolvió el problema.