Aprendiendo Desarrollo Android - Services

Services


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.


Nota: Un servicio se ejecuta en el subproceso principal de su proceso de alojamiento; el servicio no crea su propio subproceso y no se ejecuta en un proceso separado (salvo que usted especifique lo contrario). Esto significa que, si tu servicio va a realizar un trabajo que consume más CPU u operaciones de bloqueo (como reproducción MP3 o funciones de red), debes crear un subproceso nuevo dentro del servicio para realizar ese trabajo. Al utilizar un subproceso independiente, reducirás el riesgo de que se produzcan errores de tipo "La aplicación no responde (ANR)", y el subproceso principal de la aplicación puede continuar dedicado a la interacción del usuario con tus actividades.

Crear servicio


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.
  • onDestroy()
  • El sistema llama a este método cuando el servicio ya no se utiliza y se lo está destruyendo. Tu servicio debe implementar esto para limpiar recursos como subprocesos, escuchas (listeners) registrados, receptores, etc. Esta es la última llamada que el servicio recibe.


Declaración de un servicio en el manifiesto

Al igual que las actividades (y otros componentes), debes declarar todos los servicios en el archivo de manifiesto de tu aplicación.

Creación de un servicio iniciado

Un servicio iniciado es un servicio que otro componente inicia llamando a startService(), lo cual da como resultado una llamada al método onStartCommand() del servicio.
Cuando un servicio es iniciado, tiene un ciclo de vida que es independiente del componente que lo inició, y el servicio puede ejecutarse en segundo plano de manera indefinida, incluso si se destruye el componente que lo inició. Por ende, el servicio debe detenerse a sí mismo cuando su trabajo está terminado llamando a stopSelf(), o bien, otro componente puede detenerlo llamando a stopService().
Un componente de una aplicación, como una actividad, puede iniciar el servicio llamando a startService() y pasando una Intent que especifique el servicio e incluya datos para el servicio. El servicio recibe esta Intent en el método onStartCommand().

Ejemplo

Por ejemplo, supón que una actividad necesita guardar datos en una base de datos en línea. La actividad puede iniciar un servicio complementario y enviar a este los datos que se guardarán pasando una intent a startService(). El servicio recibe la intent en onStartCommand(), se conecta a Internet y realiza la transacción de la base de datos. Cuando la transacción está terminada, el servicio se detiene a sí mismo y se lo destruye.

Tradicionalmente, existen dos clases que puedes extender para crear un servicio iniciado:

Service

Esta es la clase base para todos los servicios. Cuando extiendes esta clase, es importante que crees un subproceso nuevo, en el cual se realizarán todo el trabajo del servicio, porque el servicio utiliza el subproceso principal de tu aplicación de forma predeterminada, lo que podría ralentizar el rendimiento de cualquier actividad que tu aplicación esté ejecutando.

IntentService

Esta es una subclase de Service que utiliza un subproceso de trabajo para manejar todas las solicitudes de inicio, una a la vez. Esta es la mejor opción si no necesitas que tu servicio maneje múltiples solicitudes simultáneamente. Lo único que debes hacer es implementar onHandleIntent(), que recibe la intent de cada solicitud de inicio para que puedas realizar el trabajo en segundo plano.

Inicio de un servicio

Puedes iniciar un servicio desde una actividad u otro componente de la aplicación pasando un Intent (especifica que el servicio se inicie) a startService(). El sistema de Android llama al método del servicio onStartCommand() y le pasa la Intent. (Nunca debes llamar a onStartCommand() directamente).

Por ejemplo, una actividad puede iniciar el servicio del ejemplo de la sección anterior (HelloService) usando una intent explícita con startService():

Intent intent = new Intent(this, HelloService.class);
startService(intent);

Se devuelve inmediatamente el método startService() y el sistema Android llama al método del servicio onStartCommand(). Si el servicio aún no está en ejecución, el sistema llama primero a onCreate() y luego llama a onStartCommand().

Nota: A diferencia de los métodos callback del ciclo de vida de una actividad, tú no debes llamar a la implementación de la superclase de estos métodos callback.




Enlaces de ayuda


http://www.hermosaprogramacion.com
https://developer.android.com

GitHub


Comentarios

Entradas populares de este blog

Introducción a la lógica matemática - Cap. 2 Reglas de Inferencia.

Introducción a la lógica matemática - Cap. 4 Tablas de certeza

Hubo un problema pero puedes intentarlo de nuevo Windows error OOBEEULA