Inicio > Android, Programación > Creación de Servicios con Comunicación Bidireccional con un Activity

Creación de Servicios con Comunicación Bidireccional con un Activity


Lo primero es plantear que vamos a programar y por qué.

Los servicios (services) podríamos definirlos como una parte de nuestro programa que quedará en segundo plano y que podrá seguir ejecutándose aún cuando cerremos nuestra aplicación.

Esto por ejemplo nos permite seguir realizando una tarea mientras aunque no se esté usando nuestra aplicación. En mi caso es para el Tagboard de Oberón, esto me permite cerrar la aplicación y que si llega un mensaje nuevo, lo notifique y lo envíe al Activity.

Lo que necesitamos entonces será un Service que permanezca abierto y comprobando los nuevos mensajes permanentemente y poder enviar y recibir información entre el Service y el Activity.

Los pasos que tendremos que hacer serán:

  1. Crear el Servicie
  2. Asociar el Acitivy con el Servicie
  3. Intercambiar los objetos Messenger del Servicio y el Acitivy para poder comunicarse.
  4. Enviar información entre ellos
  5. Definir cuando se cerrará el Service
Puesto que para este tutorial tengo que explicar casi cada linea, he creado un pequeño programa de ejemplo y os he subido el proyecto para Eclipse.

Descargar Proyecto Servicios 

El ejemplo se limita a mandar mensajes desde el Service  al Activity cada 10 segundos actualizando la interfaz gráfica si está el Activity abierto, en caso contrario se mostrará un Toast.

Para que os sea más fácil, primero echarle un ojo a la clase Servicio y después a Actividad.

Aún así, os resumiré un poco como va la estructura.

Cada clase tiene un método handleMessage, este método será el que reciba los mensajes de la otra clase mediante el objeto Messenger.

Cuando iniciamos el Activity, miramos si el servicio está arrancado, si es así, conectamos con él directamente, en caso contrario, esperamos a que se pulse el botón correspondiente.

Al cerrar el Activity solo nos desconectamos del servicio, pero no cerramos este. Para cerrarlo, tendremos que indicarlo expresamente con el botón.

Recordad que un servicio puede tener varios Activitys asociados, basta con en cada CONECTAR añadirlos a una lista y en cada DESCONECTAR borrarlos, aunque tendréis que enviar el mensaje a cada uno de ellos de forma individual con un for, aunque evidentemente, puedes enviar el mensaje solo a los que te interese.

Espero que con este ejemplo no tengáis problema. El próximo tutorial será para mostrar notificaciones en la barra de notificaciones.

Anuncios
  1. Maximo
    1 febrero, 2012 en 4:18 am

    Hola, Disculpa podrías subir el ejemplo nuevamente?? o enviármelo a mi correo?
    por favor

    Gracias.

  2. Nacho
    22 enero, 2013 en 10:44 am

    Hola muy buenas, quisiera consultarte una duda que tengo sobre un asunto relacionado con este post a ver si puedes plantearme un posible solución que no hago más que darle vueltas.

    Se trata de una activity 1, un servicio en background y una activity 2.
    Lo que hace el servicio es acceder a un servidor web, obtener unos datos y escribirlos en unas variables.
    La activity 1 lanza el servicio (StartService()) y a continuación lanza la activity 2 (StartActivity()), pero claro, la activity 2 no puede iniciarse hasta que el servicio no haya finalizado porque necesita las variables que éste escribe.

    Por tanto, mi idea es justo después de lanzar el servicio mostrar un ProgressDialog en el que aparezca la rueda circular de cargando y se muestre un mensaje del tipo: “Procesando. Espere unos segundos…” que se ejecute hasta que el servicio finalice. Una vez el servicio haya finalizado, que se ejecute la activity 2 y pueda disponer de las variables que el service ha escrito.

    He intentado hacer algo que se asemeje a esto pero no tengo muy claro los pasos a seguir, y a la vez me he encontrado con problemas como:
    – Se supone que el servicio acaba cuando se para con el método StopSelf() o cuando se destruye con el método OnDestroy(), pero no sé como hacerselo saber a la activity 1 para que deje de ejecutar el ProgressDialog y lance la activity 2.
    – La llamada al servicio debe ir en la activity 1 antes de la llamada a la activity 2, o al comenzar la activity 2 en el OnCreate().

    Agradecería enormemente una solución a mi cuestión ya que es de vital importancia, y llevo un tiempo atascado en este asunto.
    Muchas gracias de antemano.
    Saludos.

  3. GIO
    16 febrero, 2013 en 6:05 pm

    exelente articulo

  4. 16 abril, 2013 en 5:09 pm

    Gracias por ejemplo 😉 muy claro 😀

  5. ezequiel
    26 junio, 2013 en 3:00 am

    Muy bueno el ejemplo.
    Aprovecho para consultarte que forma hay para que el servicio siga ejecutando cuando el telefono se bloquea. O sea, el servicio sigue en segundo plano cuando se cierra la aplicacion que lanzo el servicio, pero al bloquearse el equipo por completo el servicio entra en suspensión.
    Aclaro que el servicio ejecuta una tarea cada segundo que deberia seguir ejecutandose aun con el telefono bloqueado.

    Gracias

  6. 28 octubre, 2013 en 4:23 pm

    Hola, gracias por tu aportación, me ha servido mucho. Por otr lado hay un error que me trajo penando un rato, y es que en el onDestroy de la Activity necesita verificar que esta el servicio esta corriendo para poder desconectar, de otro modo genera errores. Saludos.

    • 28 octubre, 2013 en 5:31 pm

      Gracias por el aviso Hector. A mí no me había ocurrido porque el servicie siempre lo tenía corriendo, pero es cierto que puede ocasionar problemas para servicios que terminen antes que el Activity.

  7. Marc
    10 marzo, 2014 en 11:00 am

    Hola, veo muy interesante tu post, pero no puedo ver el código fuente.
    Box dice:
    Se ha suprimido este archivo o carpeta compartida.
    ¡Gracias!

  8. 11 marzo, 2014 en 10:44 pm

    me sucede lo mismo q a marc podrias subir nuevamente el archivo de codigo fuente porfa

  9. hjkhjkhjk
    19 noviembre, 2014 en 9:06 pm

    hola amigo si podrias subir este archivo porfavor sale como suprimido

  1. 12 octubre, 2011 en 11:43 am

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: