Notificaciones en Android (II): Barra de Estado

Hace algún tiempo, ya tratamos dentro de este curso un primer mecanismo de notificaciones disponibles en la plataforma Android: los llamados Toast. Como ya comentamos, este tipo de notificaciones, aunque resultan útiles y prácticas en muchas ocasiones, no deberíamos utilizarlas en situaciones en las que necesitemos asegurarnos la atención del usuario ya que no requiere de ninguna intervención por su parte, se muestran y desaparecen automáticamente de la pantalla.

En este nuevo artículo vamos a tratar otro tipo de notificaciones algo más persistentes, las notificaciones de la barra de estado de Android. Estas notificaciones son las que se muestran en nuestro dispositivo por ejemplo cuando recibimos un mensaje SMS, cuando tenemos actualizaciones disponibles, cuando tenemos el reproductor de música abierto en segundo plano, … Estas notificaciones constan de un icono y un texto mostrado en la barra de estado superior, y adicionalmente un mensaje algo más descriptivo y una marca de fecha/hora que podemos consultar desplegando la bandeja del sistema. A modo de ejemplo, cuando tenemos una llamada perdida en nuestro terminal, se nos muestra por un lado un icono en la barra de estado superior (más un texto que aparece durante unos segundos).

demo-mised-call

… y un mensaje con más información al desplegar la bandeja del sistema, donde en este caso concreto se nos informa del evento que se ha producido (“Missed call“), el número de teléfono asociado, y la fecha/hora del evento. Además, al pulsar sobre la notificación se nos dirige automáticamente al historial de llamadas.

demo-mised-call-2

Pues bien, aprendamos a utilizar este tipo de notificaciones en nuestras aplicaciones. Vamos a construir para ello una aplicación de ejemplo, como siempre lo más sencilla posible para centrar la atención en lo realmente importante. En este caso, el ejemplo va a consistir en un único botón que genere una notificación de ejemplo en la barra de estado, con todos los elementos comentados y con la posibilidad de dirigirnos a la propia aplicación de ejemplo cuando se pulse sobre ella.

Para generar notificaciones en la barra de estado del sistema vamos a utilizar una clase incluida en la librería de compatibilidad android-support-v4.jar  que ya hemos utilizado en otras ocasiones y que debe estar incluida por defecto en vuestro proyecto si lo habéis creado con alguna versión reciente del plugin de Eclipse. Esto es así para asegurar la compatibilidad con versiones de Android antiguas, ya que las notificaciones son un elemento que han sufrido bastantes cambios en las versiones más recientes. La clase en cuestión se llama NotificationCompat.Builder y lo que tendremos que hacer será crear un nuevo objeto de este tipo pasándole el contexto de la aplicación y asignar todas las propiedades que queramos mediante sus métodos set().

En primer lugar estableceremos los iconos a mostrar mediante los métodos setSmallIcon() y setLargeIcon() que se corresponden con los iconos mostrados a la derecha y a la izquierda del contenido de la notificación en versiones recientes de Android. En versiones más antiguas tan sólo se mostrará el icono pequeño a la izquierda de la notificación. Además, el icono pequeño también se mostrará en la barra de estado superior.

A continuación estableceremos el título y el texto de la notificación, utilizando para ello los métodos setContentTitle() y setContentText().

Por último, estableceremos el ticker (texto que aparece por unos segundos en la barra de estado al generarse una nueva notificación) mediante setTicker() y el texto auxiliar (opcional) que aparecerá a la izquierda del icono pequeño de la notificación mediante setContentInfo().

La fecha/hora asociada a nuestra notificación se tomará automáticamente de la fecha/hora actual si no se establece nada, o bien puede utilizarse el método setWhen() para indicar otra marca de tiempo. Veamos cómo quedaría nuestro código por el momento:

NotificationCompat.Builder mBuilder =
	new NotificationCompat.Builder(MainActivity.this)
		.setSmallIcon(android.R.drawable.stat_sys_warning)
		.setLargeIcon((((BitmapDrawable)getResources()
			.getDrawable(R.drawable.ic_launcher)).getBitmap()))
		.setContentTitle("Mensaje de Alerta")
		.setContentText("Ejemplo de notificación.")
		.setContentInfo("4")
		.setTicker("Alerta!");

El segundo paso será establecer la actividad a la cual debemos dirigir al usuario automáticamente si éste pulsa sobre la notificación. Para ello debemos construir un objeto PendingIntent, que será el que contenga la información de la actividad asociada a la notificación y que será lanzado al pulsar sobre ella. Para ello definiremos en primer lugar un objeto Intent, indicando la clase de la actividad concreta a lanzar, que en nuestro caso será la propia actividad principal de ejemplo (MainActivity.class). Este intent lo utilizaremos para construir el PendingIntent final mediante el método PendingIntent.getActivity(). Por último asociaremos este objeto a la notificación mediante el método setContentIntent() del Builder. Veamos cómo quedaría esta última parte comentada:

Intent notIntent =
    new Intent(MainActivity.this, MainActivity.class);

PendingIntent contIntent =
    PendingIntent.getActivity(
        MainActivity.this, 0, notIntent, 0);

mBuilder.setContentIntent(contIntent);

Por último, una vez tenemos completamente configuradas las opciones de nuestra notificación podemos generarla llamando al método notify() del Notification Manager,al cual podemos acceder mediante una llamada a getSystemService() con la constante Context.NOTIFICATION_SERVICE. Por su parte al método notify() le pasaremos como parámetro un identificador único definido por nosotros que identifique nuestra notificación y el resultado del builder que hemos construido antes, que obtenemos llamando a su método build().

NotificationManager mNotificationManager =
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

mNotificationManager.notify(NOTIF_ALERTA_ID, mBuilder.build());

Ya estamos en disposición de probar nuestra aplicación de ejemplo. Para ello vamos a ejecutarla en el emulador de Android y pulsamos el botón que hemos implementado con todo el código anterior. Si todo va bien, debería aparecer en ese mismo momento nuestra notificación en la barra de estado, con el icono y texto definidos.

notificacion-ticker

Si ahora salimos de la aplicación y desplegamos la bandeja del sistema podremos verificar el resto de información de la notificación tal como muestra la siguiente imagen:

notificacion-completa

Por último, si pulsamos sobre la notificación se debería abrir de nuevo automáticamente la aplicación de ejemplo.

En definitiva, como podéis comprobar es bastante sencillo generar notificaciones en la barra de estado de Android desde nuestras aplicaciones. Os animo a utilizar este mecanismo para notificar determinados eventos al usuario de forma bastante visual e intuitiva.

Puedes consultar y/o descargar el código completo de los ejemplos desarrollados en este artículo accediendo a la página del curso en GitHub.

Curso de Programación Android en PDF

Este curso también está disponible en PDF. Descubre cómo conseguirlo…

¿Te ha sido de utilidad el Curso de Programación Android? ¿Quieres colaborar de forma económica con el proyecto? Puedes contribuir con cualquier cantidad, unos céntimos, unos euros, cualquier aportación será bienvenida. Además, si tu aportación es superior a una pequeña cantidad simbólica recibirás como agradecimiento un documento con la última versión del curso disponible en formato PDF. Sea como sea, muchas gracias por colaborar!

Más información:

, , , , , , ,

15 Responses to Notificaciones en Android (II): Barra de Estado

  1. Eugenio 23/10/2011 en 21:37 #

    Gracias por todos los tutoriales son de mucha utilidad y de gran valor para los que estamos empezando. Un gran trabajo muy ilustrativo y bien explicado.

    saludos

  2. Jajoo 27/10/2011 en 23:12 #

    Muchas gracias por todo, el mejor no es aquel que posea mayor conocimiento sino aquel que además de poseerlo lo comparte. Gracias por esforzarte en las explicaciones.

  3. Ric 10/03/2012 en 16:37 #

    Saludos amigo. Tengo un problema con la barra de estado de mi android 1.5 (recién adquirido). en algún momento entró un sms y lo borré sin ver la notificación. lo que produjo una suerte de bucle, ya que continuamente me informa que tengo un sms por leer, sin embargo, tal sms no existe, cuando le doy “ver”, me lleva a un cuadro de respuesta cuya dirección es: mssmscovertions0. y siempre me mantiene la notificación en la barra de estado. Hay alguna forma de borrar esa notificación? Ya he vaciado el caché de la aplicación Mensajes y siempre vuelve esa notificación. Necesito un exorcismo o hay algún recodo en el software que borre ese tipo de bucle-notificación? Agradezco la respuesta que puedas darme.

  4. Elver Florez 13/07/2012 en 15:06 #

    Poco a poco he avanzado en mi aplicacion ya casi la termino, pero ahora tengo un problema con esta notificacion y es que sale error al presionarla para abrir de nuevo mi aplicacion. y el error es porque yo le estoy pasando unos datos con el Bundle. por favor colaborame con esto. he buscado durante varios dias y no he encontrado como solucionarlo. de verdad te agradezco que me des una mano.

  5. Agustin 12/09/2012 en 19:01 #

    Se puede agendar un notificación para que se dispare a cierta hora y fecha ? o sea quiero que se me dispare un notificacion pero en cierta fecha y hora.
    Saludos!

  6. Lugh 29/01/2013 en 18:39 #

    Hola que tal te queria consultar estoy implementando un servico de gcm y una notificacion en la barra de estado para cuando llega un mensaje ahora bien.
    Quiero hacer dos cosas.
    1- cuando llega el mensaje desplejar aparte de la notificacion una pantalla.
    2- en la notificaicon cuando hace click el usuario puedo de ahi llamar a otra pantalla y pasarle informacion

    Muchas gracias.

  7. Paloky 13/03/2013 en 8:31 #

    Hola.
    Muchas gracias por el tutorial. Es muy bueno.
    Siguiendo este tutorial, tengo una consulta.

    Existe alguna forma de poder capturar los eventos de la barra de estados.
    Por ejemplo. Quiero que mi aplicación sepa cuando mi dispositivo recibe un “whatsup”, o un “SMS” o cualquier otro tipo de notificación.

    Gracias.

  8. christian 10/04/2013 en 23:05 #

    Hola, muy buen tutorial, soy nuevo programando en android,
    me podrías ayudar como agregar un icono de notificación personalizado
    como una imagen.
    gracias.

  9. carlos ortega 08/06/2013 en 2:11 #

    hola amig@ yo tengo un problema que desde ayer la barra de estado no me aparece parece y el programa tampoco sera que se elimino la barra como ago para recuperarla porfavor ayuda

  10. Ivan 09/01/2014 en 16:01 #

    Salvador,

    Te quiero felicitar por tu aporte al conocimiento, al emprendimiento, al desarrollo de las tecnologías. En estos días estoy desarrollando una aplicación para Android y sin darme cuenta, me he vuelto fans de tu sitio.

    Tu aporte es muy profesional y serio. Te doy las gracias por la ayuda y la buena onda.

    Gracias!

  11. erick 26/05/2014 en 4:54 #

    Hola como le hago para que al darle click a la notificacion desaparezca de la barra de notificaciones?

  12. Greisy 28/05/2014 en 22:32 #

    Quisiera saber como hago para que cuando me llegue un sms no se muestre en la notificacion pero que me suene el celular, porque cuando lo desactivo tampoco me suena y no me doy cuenta cuando me llegan.. espero respuestas muchas gracias, saludos

Trackbacks/Pingbacks

  1. Desarrollo en Android | sgoliver.net blog - 20/10/2011

    [...] Notificaciones en Android (II): Barra de Estado [Nuevo!] [...]

  2. Notificaciones en Android (III): Diálogos | sgoliver.net blog - 05/11/2011

    [...] a la hora de mostrar notificaciones a los usuarios de nuestra aplicaciones: los toast y las notificaciones de la barra de estado. En este último artículo sobre notificaciones vamos a comentar otro mecanismo que podemos [...]

  3. LectorRSS actualización 1.3.4 « jmtu - 11/01/2012

    [...] muy bien explicado tanto en el muy recorrido curso de android de sgoliver, concretamente en este capítulo. Como también en la web para desarrolladores de android, aquí. Y poco más puedo añadir a esto, [...]

Deja un comentario

Powered by WordPress. Designed by Woo Themes