"Si inicias un servicio de Android, startService(..)
ese servicio seguirá ejecutándose hasta que lo invoques explícitamente stopService(..)
. Hay dos razones por las que el sistema puede ejecutar un servicio. Si alguien llama Context.startService()
, el sistema recuperará el servicio (creándolo y llamando a su onCreate()
método si necesario) y luego llamar a su onStartCommand(Intent, int, int)
método con los argumentos proporcionados por el cliente. En este punto, el servicio continuará ejecutándose hasta que se llame Context.stopService()
o stopSelf()
. Tenga en cuenta que varias llamadas para Context.startService()
no anidar (aunque dan como resultado múltiples llamadas correspondientes a onStartCommand()
), por lo que no importa cuántas veces se inicie, un servicio se detendrá una vez Context.stopService()
o stopSelf()
se llamará; sin embargo, los servicios pueden usar sustopSelf(int)
método para garantizar que el servicio no se detenga hasta que se hayan procesado las intenciones iniciadas.
Los clientes también pueden utilizar Context.bindService()
para obtener una conexión persistente a un servicio. Esto también crea el servicio si aún no se está ejecutando (llamando onCreate()
mientras lo hace), pero no llama onStartCommand()
. El cliente recibirá el IBinder
objeto que el servicio devuelve de su onBind(Intent)
método, lo que le permitirá volver a llamar al servicio. El servicio seguirá funcionando mientras se establezca la conexión (independientemente de que el cliente conserve una referencia en el Servicio IBinder
). Por lo general, la IBinder
devolución es para una interfaz compleja que se ha escrito en AIDL.
Un servicio puede iniciarse y tener conexiones vinculadas a él. En tal caso, el sistema mantendrá el servicio en ejecución mientras se inicie o haya una o más conexiones con el Context.BIND_AUTO_CREATE
indicador. Una vez que ninguna de estas situaciones se cumple, onDestroy()
se llama al método del Servicio y el servicio se cancela efectivamente. Toda la limpieza (detener hilos, cancelar el registro de receptores) debe estar completa al regresar onDestroy()
".