android - stopservice - onServiceDisconnected() no se llama después de llamar a Service stopSelf()
stopservice android (2)
De acuerdo con el documento oficial, se llamaría a onServiceDisconnected () si el servicio fallara o se eliminara. Enlace http://developer.android.com/reference/android/content/ServiceConnection.html
Llamado cuando se ha perdido una conexión con el Servicio. Esto suele suceder cuando el proceso que aloja el servicio se ha bloqueado o se ha eliminado. Esto no elimina el ServiceConnection en sí mismo: este enlace al servicio permanecerá activo, y recibirá una llamada a onServiceConnected (ComponentName, IBinder) cuando el Servicio se ejecute a continuación.
Tengo una Activity
en la que comienzo y me enlacé a un Service
descarga.
Cuando se llama a stopSelf()
en el Service
, no se llama a onServiceDisconnected()
en la Activity
.
Espero que se llame, ya que si el Service
se detiene, todas las actividades vinculadas deben estar sin consolidar.
¿Qué me estoy perdiendo?
Simplemente enviando una notificación a un cliente vinculado y llamando a stopSelf()
(o stopService()
) no logrará realmente lo que está tratando de hacer. unbindService()
llamar a unbindService()
en el cliente vinculado (y el servicio no debe tener otros clientes vinculados) para destruir el servicio.
Hay dos tipos de servicios, servicios "iniciados" y servicios "vinculados". No son mutuamente exclusivos. Si inició el servicio utilizando startService()
, tiene un servicio "iniciado". Si inicia el servicio a través de bindService()
, está enlazado. Si se enlaza con el servicio y también usa startService()
, son ambos. Entonces, hay tres opciones posibles para administrar el ciclo de vida de un servicio:
1) Servicio iniciado: llama a startService()
para iniciarlo; el servicio solo se detendrá llamando a stopService()
o stopSelf()
.
2) Servicio bindService()
: usted llama a bindService()
y pasa el indicador BIND_AUTO_CREATE
. Otros clientes pueden vincularse y desvincularse del servicio a voluntad, el servicio se destruirá automáticamente cuando todos los clientes se hayan desconectado. En este caso, llamar a stopService()
o stopSelf()
no tiene ningún efecto.
3) Combo: los clientes se unen al servicio y usted también ha llamado startService()
. En este caso, llamar a stopSelf()
o stopService()
solo destruirá el servicio una vez que todos los clientes se hayan desconectado. Del mismo modo, el servicio no se destruirá automáticamente cuando todos los clientes se hayan desconectado, hasta que se haya llamado a stopSelf()
o stopService()
.
La documentación para el ciclo de vida de los servicios combinados dice:
Estos dos caminos no están completamente separados. Es decir, puede enlazar a un servicio que ya se inició con
startService()
. Por ejemplo, un servicio de música de fondo podría iniciarse llamando astartService()
con un Intent que identifique la música que se reproducirá. Más tarde, posiblemente cuando el usuario quiera ejercer algún control sobre el reproductor u obtener información sobre la canción actual, una actividad puede vincularse al servicio llamando abindService()
. En casos como este,stopService()
ostopSelf()
no detiene el servicio hasta que todos los clientes se desvinculan.
Así que en tu caso, tienes un cliente vinculado. La llamada a stopSelf()
no desconecta a la fuerza a los clientes vinculados, por lo que debe notificar explícitamente a su cliente que el servicio quiere apagarse, y luego su cliente debe llamar a unbindService()
antes de que se destruya el servicio. Puede lograrlo de varias maneras, la mayoría de las veces a través de una transmisión o una interfaz IBinder, o un mensajero o AIDL si se está comunicando con su servicio en todos los procesos.