Un service es un componente de Android que puede realizar trabajo sin tener interfaz de usuario propia, como reproducir música, sincronizar datos o una transferencia de archivos en curso. Junto con las activities, los broadcast receivers y los content providers, los services son uno de los cuatro componentes fundamentales de las apps Android y, como los demás, deben registrarse en el AndroidManifest.xml de la app. Por defecto, un service se ejecuta en el hilo principal de la app, por lo que el trabajo pesado debe trasladarse igualmente a un hilo en segundo plano.
Android distingue entre services iniciados, que realizan una tarea hasta que se detienen, y services vinculados, a los que otros componentes pueden vincularse para comunicarse con ellos. Un foreground service realiza un trabajo del que el usuario es consciente y debe mostrar una notificación persistente. Como el trabajo en segundo plano afecta a la autonomía de la batería y al rendimiento, Android ha ido introduciendo restricciones sobre cuándo pueden las apps iniciar services en segundo plano y, para el trabajo aplazable, Google suele recomendar WorkManager en su lugar.
Un service en Android es un componente de la app que realiza trabajo sin interfaz de usuario propia, como la reproducción de música, la sincronización o las transferencias de archivos. Puede iniciarse para realizar una tarea o ser vinculado por otros componentes que quieran comunicarse con él. Los foreground services muestran una notificación persistente para que el usuario sepa que el trabajo se está realizando y, debido a las restricciones de Android sobre el trabajo en segundo plano, a menudo se utiliza WorkManager para las tareas aplazables.
Más sobre Service
Un service es uno de los cuatro componentes fundamentales de una app Android, junto con las activities, los broadcast receivers y los content providers. Mientras que una activity muestra una pantalla con la que interactúa el usuario, un service se utiliza para trabajo que no requiere interfaz de usuario o que debe continuar aunque el usuario abandone la pantalla. Ejemplos típicos son reproducir música o pódcasts, la navegación, la subida de archivos y la sincronización de datos con un servidor.
Técnicamente, un service es una clase que hereda de android.app.Service y se registra con un elemento service en AndroidManifest.xml. El sistema controla el ciclo de vida del service mediante métodos como onCreate(), onStartCommand(), onBind() y onDestroy(). Es importante saber que un service no se ejecuta automáticamente en un hilo independiente. Por defecto, su código se ejecuta en el hilo principal de la app, por lo que el trabajo de larga duración o bloqueante debe trasladarse a un hilo en segundo plano, por ejemplo con corrutinas de Kotlin, para evitar que la app deje de responder.
Los services pueden utilizarse de distintas formas, cada una adecuada para necesidades diferentes:
Foreground service: realiza un trabajo del que el usuario es consciente, como la reproducción de música o el seguimiento activo de un entrenamiento. Un foreground service debe mostrar una notificación persistente y, en las versiones más recientes de Android, la app debe declarar un tipo de service y disponer de los permisos correspondientes.
Background service: realiza un trabajo que el usuario no ve directamente. Desde Android 8.0 existen restricciones estrictas sobre cuándo pueden las apps iniciar estos services mientras ellas mismas están en segundo plano.
Bound service: ofrece una interfaz cliente-servidor en la que otros componentes, incluidos los de otras apps, pueden vincularse al service, enviar solicitudes y recibir respuestas. Un bound service existe mientras al menos un componente esté vinculado a él.
Uno de los mayores puntos fuertes de los services es que permiten a una app continuar un trabajo importante sin que esté ligado a una pantalla concreta. Al mismo tiempo, requieren cuidado, porque el trabajo en segundo plano consume batería, memoria y datos. Por eso, Android ha ido introduciendo normas que restringen el trabajo en segundo plano, y los usuarios pueden ver y detener las apps que ejecutan foreground services.
Para muchas tareas, Google recomienda en su lugar WorkManager, que forma parte de Android Jetpack. WorkManager está pensado para trabajo que debe realizarse de forma fiable, aunque la app se cierre o el dispositivo se reinicie, y que puede aplazarse, como la subida de archivos de registro o la sincronización periódica. WorkManager tiene en cuenta las restricciones del sistema y puede configurarse con condiciones como disponer de conexión de red o estar cargando.
En resumen, un service es la opción adecuada cuando una app necesita realizar un trabajo continuo que el usuario espera que siga en marcha, o cuando otros componentes necesitan comunicarse con un proceso de larga duración. Eligiendo el tipo de service adecuado, o WorkManager cuando el trabajo puede aplazarse, los desarrolladores pueden crear apps funcionales y respetuosas con los recursos del dispositivo.
Preguntas frecuentes sobre Service
¿Qué es un service en Android?
Un service es un componente de Android que realiza trabajo en segundo plano sin tener interfaz de usuario propia. Se utiliza para tareas que deben continuar aunque el usuario no esté mirando la app, como reproducir música, la navegación en curso o la subida de archivos.
Un service debe declararse en el archivo AndroidManifest.xml. Es importante saber que, por defecto, un service se ejecuta en el hilo principal de la app. Por tanto, las tareas pesadas deben trasladarse igualmente a un hilo en segundo plano o a una corrutina. En las versiones más recientes de Android también existen normas estrictas sobre cuándo pueden ejecutarse las apps en segundo plano, con el fin de ahorrar batería.
¿Qué tipos de service existen en Android?
Android distingue entre tres tipos de service. Un foreground service realiza una tarea de la que el usuario es consciente y debe mostrar una notificación mientras se ejecuta. Se utiliza, por ejemplo, para la reproducción de música o el seguimiento de una carrera.
Un background service realiza un trabajo que el usuario no ve directamente. Desde Android 8.0 existen restricciones estrictas sobre cuándo pueden las apps iniciar estos services, y para muchas tareas se recomienda WorkManager en su lugar. Un bound service permite que otros componentes, como una activity, se vinculen a él y se comuniquen con él, y solo se ejecuta mientras haya algo vinculado.
¿Cuál es la diferencia entre un started service y un bound service?
Un started service se inicia con startService o startForegroundService y se ejecuta hasta que se detiene a sí mismo o es detenido. Normalmente realiza una tarea concreta y no devuelve un resultado directamente al componente que lo inició.
Un bound service se inicia cuando otro componente se vincula a él con bindService. Ofrece una interfaz para que el componente pueda llamar a métodos y recibir respuestas, por ejemplo una activity que controla un reproductor de música. Cuando ya no queda ningún componente vinculado, se detiene. Un service también puede ser ambas cosas a la vez si está iniciado y vinculado.
¿Cuándo debe utilizarse WorkManager en lugar de un service?
WorkManager es la solución recomendada por Google para el trabajo en segundo plano que debe realizarse de forma fiable, aunque la app se cierre o el dispositivo se reinicie. Puede tratarse de la sincronización de datos, la subida de archivos de registro o una limpieza periódica.
WorkManager respeta las normas del sistema sobre batería y actividad en segundo plano y puede configurarse para ejecutarse solo cuando, por ejemplo, el dispositivo esté conectado a wifi o cargando. Un service, sobre todo un foreground service, es más adecuado cuando el trabajo debe realizarse de inmediato y es visible para el usuario, como la reproducción de música o una llamada en curso. Para el trabajo de corta duración mientras la app está abierta, las corrutinas suelen ser suficientes.
¿Por qué debe mostrar una notificación un foreground service?
Un foreground service puede ejecutarse durante mucho tiempo y consumir recursos como el procesador, la batería y los datos de ubicación mientras el usuario no tiene la app abierta. Por eso, Android exige que muestre una notificación persistente, para que el usuario sepa que la app está trabajando en segundo plano.
Esto aporta transparencia y permite al usuario detener el service o abrir la app. En las versiones más recientes de Android, los desarrolladores también deben declarar un tipo para el service, como reproducción multimedia, ubicación o sincronización de datos, y disponer de los permisos correspondientes. A partir de Android 13, el usuario también debe conceder permiso para las notificaciones, lo que influye en cómo se muestra la notificación.
¿Qué restricciones impone Android al trabajo en segundo plano?
Para ahorrar batería y proteger la privacidad del usuario, Android ha ido introduciendo restricciones al trabajo en segundo plano. Desde Android 8.0, las apps en segundo plano no pueden, por lo general, iniciar background services normales, y el sistema los detiene al cabo de poco tiempo.
El modo Doze y App Standby aplazan el acceso a la red y las tareas cuando el dispositivo no se está utilizando o la app se usa poco. Las versiones más recientes exigen tipos y permisos para los foreground services y restringen cuándo pueden iniciarse desde segundo plano. El acceso a la ubicación en segundo plano requiere un permiso independiente. Por tanto, el trabajo en segundo plano debe programarse con WorkManager siempre que sea posible.
Service para dummies
Un service en una app Android es una especie de ayudante invisible que puede seguir trabajando aunque nadie esté mirando la app. Piensa en una app de música: pones una canción, vuelves a la pantalla de inicio y escribes un mensaje, y la música sigue sonando. De eso se encarga un service. Cuando una app usa un service para algo que debes saber, el teléfono muestra una pequeña notificación, para que quede claro que la app está trabajando. Al mismo tiempo, Android se asegura de que las apps no gasten demasiada energía en segundo plano, para que la batería dure más.