Servicios

Un Service es un componente de una aplicación que puede realizar operaciones de larga ejecución en segundo plano y que no proporciona una interfaz de usuario. Otro componente de la aplicación puede iniciar un servicio y continuará ejecutándose en segundo plano aunque el usuario cambie a otra aplicación. Además, un componente puede enlazarse con un servicio para interactuar con él e incluso realizar una comunicación entre procesos (IPC). Por ejemplo, un servicio puede manejar transacciones de red, reproducir música, realizar I/O de archivos o interactuar con un proveedor de contenido, todo en segundo plano.

Un servicio puede adoptar esencialmente dos formas:

Servicio iniciado

Un servicio está "iniciado" cuando un componente de aplicación (como una actividad) lo inicia llamando a startService(). Una vez iniciado, un servicio puede ejecutarse en segundo plano de manera indefinida, incluso si se destruye el componente que lo inició. Por lo general, un servicio iniciado realiza una sola operación y no devuelve un resultado al emisor. Por ejemplo, puede descargar o cargar un archivo a través de la red. Cuando la operación está terminada, el servicio debe detenerse por sí mismo.

Servicio de enlace

Un servicio es de “de enlace” cuando un componente de la aplicación se vincula a él llamando a bindService(). Un servicio de enlace ofrece una interfaz cliente-servidor que permite que los componentes interactúen con el servicio, envíen solicitudes, obtengan resultados e incluso lo hagan en distintos procesos con la comunicación entre procesos (IPC). Un servicio de enlace se ejecuta solamente mientras otro componente de aplicación está enlazado con él. Se pueden enlazar varios componentes con el servicio a la vez, pero cuando todos ellos se desenlazan, el servicio se destruye.

En esta documentación, estos tipos de servicios generalmente se abordan por separado, pero el tuyo puede funcionar de ambas formas; puede iniciarse (para ejecutarse de manera indefinida) y también permitir los enlaces. Solo depende de que implementes un par de métodos de callback: onStartCommand() para permitir que los componentes lo inicien, y onBind() para permitir los enlaces.

Independientemente de que tu aplicación esté iniciada, enlazada o ambas, cualquier componente de la aplicación puede utilizar el servicio (incluso desde otra aplicación), de la misma forma que cualquier componente puede utilizar una actividad—iniciándola con una Intent. Sin embargo, tú puedes declarar el servicio como privado, en el archivo de manifiesto, y bloquear el acceso de otras aplicaciones. Esto se explica en más detalle en la sección Declaración del servicio en el manifiesto.


Conceptos básicos


Para crear un servicio, debes crear una subclase de Service (o una de sus subclases existentes). En tu implementación, debes reemplazar algunos métodos callback que manejan aspectos fundamentales del ciclo de vida del servicio y proporcionar un mecanismo para que los componentes se enlacen con el servicio, si corresponde. Los métodos callback más importantes que debes reemplazar son los siguientes:

onStartCommand()

El sistema llama a este método cuando otro componente, como una actividad, solicita que se inicie el servicio, llamando a startService(). Una vez que se ejecuta este método, el servicio se inicia y se puede ejecutar en segundo plano de manera indefinida. Si implementas esto, será tu responsabilidad detener el servicio cuando tu trabajo esté terminado. Para ello, llama a stopSelf() o stopService(). (Si solo deseas proporcionar enlaces, no necesitas implementar este método).

onBind()

El sistema llama a este método cuando otro componente desea enlazarse con el servicio (por ejemplo, para ejecutar RPC), llamando a bindService(). En tu implementación de este método, debes proporcionar una interfaz que los clientes utilicen para comunicarse con el servicio, devolviendo una IBinder. Siempre debes implementar este método, pero si no deseas permitir los enlaces, debes devolver NULL.

onCreate()

El sistema llama a este método cuando se crea el servicio por primera vez, para realizar los procedimientos de configuración por única vez (antes de llamar a onStartCommand() o onBind()). Si el servicio ya se está ejecutando, no se llama a este método.