Los servicios son clases que van a ejecutar código «en segudo plano», es decir, de forma transparente al usuario. ¿Qué quiere decir esto? Que el usuario no va (o no debe) percibir que hay código ejecutándose mientras él hace otras cosas. Existen varias diferencias fundamentales entre los servicios y las actividades, pero hay dos que nos van a permitir elegir rápidamente entre ellas cuando necesitemos programar una funcionalidad en nuestra app.
- Interfaz gráfica: Si la operación no necesita que haya una interfaz gráfica (más allá de un botón de activar o desactivar) puedes usar un servicio en lugar de una actividad. Las actividades son «pantallas» de nuestra app, con lo que siempre van a requerir de una GUI.
- Operación transversal: Es decir, que la operación se va a estar realizando pase lo que pase en la parte visual. ¿Es posible que ocurran varias transiciones de pantallas mientras que se ejecuta la funcionalidad? Entonces es un servicio. Si requiere el foco permanentemente y no puede «sobrevivir al paso de las actividades» entonces puedes programarlo en una activity.
En estos casos que acabamos de ver puedes usar servicios aunque no sean imprescindibles. Imaginemos, por ejemplo una app que cuente los pasos del usuario. Podemos hacer que se cuenten siempre que el usuario tenga la app abierta (incluso cuando la haya cerrado) o que solo los cuente cuando hay una determinada pantalla activa. En ambos casos podemos usar un servicio, y solo en el segundo, podríamos usar un hilo de ejecución en la actividad principal.
Por último, cabe destacar que los servicios se usan normalmente cuando hay operaciones constantes o computacionalmente pesadas. El sistema operativo puede cancelarlas si lo considera oportuno, por lo que hay que tener cuidado con eso y con el uso de recursos como la batería. Si somos descuidados podemos hacer que la batería del dispositivo se consuma rápidamente.
Creación y gestión de Servicios Android
Existen dos instrucciones para crear un servicio: startService() y bindService(). La diferencia es que con la segunda el servicio queda atado o enlazado al proceso que lo creó. Esto significa que si el invocador muere en algún momento de la ejecución, el servicio también morirá. La forma de evitar esto es invocándolo con startService(), que lo creará y se ejecutará de forma independiente pase lo que pase con el proceso invocador. Cabe destacar que estos dos métodos se deben llamar desde el invocador, que ha instanciado previamente el objeto servicio.
Métodos Callback
Dentro de nuestra clase Service vamos a encontrar algunos métodos callback que vamos a poder sobreescribir y utilizar según nuestra conveniencia:
- onStartCommand(): se llama cuando se ejecuta startService() en el proceso invocador.
- onBind(): igual que el anterior, pero cuando se llama a bindService().
- onCreate(): como su propio nombre indica, se autoejecuta cuando el servicio se crea por primera vez.
- onDestroy(): se ejecuta justo antes de que el servicio desaparezca.
¿Cómo crear un servicio en Android Studio?
Para crear un servicio en Android Studio hay que seguir los siguientes pasos
Declaración en el Manifest
Debemos incluir una sentencia de declaración del servicio en nuestro Manifest. Ésta irá precedidad de la etiqueta <service>.
Crear la clase del servicio
Definiremos la nueva clase heredando de Service o IntentService.
Instanciar la clase desde el invocador
Desde la propia clase que va a invocar el servicio, lo instanciamos con un intent y llamamos a startService() (de manera muy similar a como si fuera una Activity).
Destruir el servicio
Si el servicio no acabase solo cuando se cumpla una circustancia, podemos utilizar el objeto Service que instanciamos en el invocador para llamar a stopService() o hacerlo desde el propio servicio con stopSelf().
Diferencias entre IntentService y Service
La diferencia fundamental entre estos dos tipos de servicio es la capacidad de personalización. Mientras que el IntentService está preparado para ejecutarse fácilmente, el Service nos da más juego, pero también requiere de más intervención por nuestra parte. Puedes profundizar acerca de esto en el vídeo del curso Android Gratis: