Androideity

Programación android en español, tutoriales, documentación, noticias, smartphones, tablets, programación android, aplicaciones android

Creando notificaciones en la Status Bar de Android

| | 16 Comentarios

Podemos identificar el uso de notificaciones en la Status Bar cuando aparecen iconos en la misma (con la opción de que un pequeño texto los acompañe) y que además, dan lugar a un mensaje desplegable en la ventana de notificaciones. Cuando el usuario selecciona el mensaje desplegado, Android se encarga de disparar un Intent que es definido por la notificación y que generalmente se utiliza para llamar a una actividad. Hay que mencionar que también es posible configurar este tipo de notificaciones para alertar al usuario con un sonido, vibración del teléfono e incluso con luces parpadeantes del dispositivo (como el famoso LED de Blackberry).

Las notificaciones en la Status Bar deben utilizarse para cualquier caso en el que un servicio en background necesite alertar al usuario con respecto a algún evento que requiera de una respuesta. Un servicio en background no debe lanzar una actividad de forma directa con el fin de interactuar con el usuario. En lugar de eso, el servicio deberá crear una notificación en la Status Bar que es la que lanzará la actividad en cuanto sea seleccionada por el usuario.

Para irnos poniendo en materia, a continuación te presento el aspecto que tienen las notificaciones en la Status Bar:

Y la siguiente imagen muestra el aspecto de los mensajes desplegables en la ventana de notificaciones. La forma en la que el usuario accesa a esta ventana es desplazando con el dedo la Status Bar hacia abajo (o presionando el botón Menú > Notificaciones).

 

Conceptos Básicos

Tanto una Activity como un Service pueden desplegar notificaciones en la Status Bar. Debido a que una Activity puede realizar acciones solamente cuando está activa o tiene el foco, la manera más común de lanzar notificaciones a la Status Bar será a través de servicios. De esta forma, las notificaciones pueden ser creadas desde el background, mientras el usuario está utilizando otras aplicaciones o mientras el dispositivo está “inactivo”. Para crear una notificación, debemos hacer uso de dos clases: Notification y NotificationManager.

Utilizamos una instancia de la clase Notification para definir las propiedades de la notificación, tales como el icono que se desplegará en la Status Bar, el mensaje desplegable y ajustes extras como algún sonido. En cuando a NotificationManager, se trata de un servicio del sistema que ejecuta y gestiona todos los objetos de tipo Notification del dispositivo. No es necesario crear un objeto de NotificationManager; basta con tener una variable de este tipo a la cuál le asignaremos lo que retorne el método getSystemService() y luego, cuando se necesite notificar la usuario, pasar el objeto Notification a esta instancia través del método notify().

Para que quede más claro, a continuación está la secuencia en código que acabo de explicar:

1. Obtener la referencia de NotificationManager:

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

2. Crear una instancia de Notification:

int icon = R.drawable.notification_icon;
CharSequence tickerText = "Hello";
long when = System.currentTimeMillis();

Notification notification = new Notification(icon, tickerText, when);

3. Definir el mensaje desplegable y el Intent:

Context context = getApplicationContext();
CharSequence contentTitle = "My notification";
CharSequence contentText = "Hello World!";
Intent notificationIntent = new Intent(this, MyClass.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

4. Pasar la Notification al NotificationManager:

private static final int HELLO_ID = 1;

mNotificationManager.notify(HELLO_ID, notification);

El primer parámetro del método notify() es un ID que debe ser único para el objeto Notification que se pasa como segundo parámetro. Este ID nos permite diferenciar cada notificación dentro de nuestra aplicación; y resulta necesario cuando requerimos actualizar a Notification o en el caso de que estemos manejando varios tipos de notificaciones, se seleccione la acción apropiada para el Intent definido en la Notification.

¡Lo tenemos! Con esto ya es posible notificar a los usuarios.

 

Manos a la obra

Pasemos a la parte divertida del código y vamos a crear una notificación personalizada para la Status Bar. Para ello creamos un nuevo proyecto con el nombre BarNotificationTest con la versión Android 2.2.

La idea del ejemplo es desplegar un botón en la actividad que al presionar lance la notificación en la Status Bar.

1. Definimos el layout de nuestra aplicación modificando el archivo main.xml del directorio res > layout. El código deberá quedarte como te muestro a continuación:

2. Ahora, creamos el layout para el mensaje que se desplegará en la ventana de notificaciones. He agregado un nuevo archivo XML llamado notification_layout.xml dentro de la carpeta res > layout. En él, he definido una imagen y una etiqueta que desplegará mi mensaje como te muestro a continuación:

Como puedes ver hemos asignado el atributo android:id a cada uno de estos elementos ya que necesitamos definirlos desde la aplicación.

3. Vamos a copiar una imagen PNG dentro del directorio res > drawable (en caso de no tener este directorio tendremos que crearlo dando clic derecho sobre la carpeta res y elegir New > Folder). Esta imagen la definiremos como parte del mensaje desplegable de la notificación cuando estemos escribiendo el código Java de este ejemplo.

4. Abrimos la actividad principal de nuestro proyecto y copiamos las siguientes sentencias import con todas las clases que utilizaremos a lo largo del ejemplo.

import android.app.Activity;
import android.os.Bundle;
import android.widget.RemoteViews;
import android.widget.Button;
import android.view.View;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;

5. Dentro de la clase BarNotificationTestActivity que es el nombre de la actividad principal donde yo trabajaré defino una constante que es el ID que identificará a la notificación tal y como te muestro a continuación:

private final int NOTIFICATION_ID = 1010;

6. Ahora, vamos a crear un nuevo método llamado triggerNotification() . Este método debe estar colocado después de la llave que cierra el método onCreate() de la actividad. Este es el código que vamos a escribir dentro de él:

private void triggerNotification(){

        NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        Notification notification = new Notification(R.drawable.androideity, "¡Nuevo mensaje!", System.currentTimeMillis());

        RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.notification_layout);
        contentView.setImageViewResource(R.id.img_notification, R.drawable.androideity);
        contentView.setTextViewText(R.id.txt_notification, "Ey mundo! Esta es mi notificación personalizada.");

        notification.contentView = contentView;

        Intent notificationIntent = new Intent(this, BarNotificationTestActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
        notification.contentIntent = contentIntent;

        notificationManager.notify(NOTIFICATION_ID, notification);
    }

Tal y como expliqué en la parte teórica de este post, lo primero que hacemos es obtener una referencia de NotificationManager haciendo uso del método getSystemService(). Enseguida creamos la notificación definiendo el icono, el mensaje y el momento (entiéndase por fecha) que se desplagará en la status bar.

Después utilizamos RemoteViews para definir la imagen y el texto que tendrá el mensaje desplegado de la notificación en la ventana de notificaciones y que además, hemos definido en el archivo notification_layout.xml. El constructor de RemoteViews que utilizamos en este ejemplo recibe como primer parámetro el paquete dentro del cuál se encuentra nuestra aplicación y que podemos obtener fácilmente utilizando el método getPackageName(). El segundo parámetro responde al archivo de layout dónde tenemos definidos los widgets que se mostrarán en el mensaje desplegable. A través de este constructor y de sus parámetros podemos personalizar el aspecto visual del mensaje en base a un layout propio.

Con el objeto contentView creado, le asignamos la imagen a través del método setImageViewResource() que como primer parámetro recibe el contenedor ImageView que definimos en el archivo notification_layout.xml y cuyo ID es img_notification; como segundo parámetro le pasamos la referencia a la imagen que agregamos en el paso 3.  Seguimos una mecánica similar para definir el texto con el método setTextViewContext() definiendo como primer parámetro la referencia al TextView del archivo notification_layout.xml a través de su ID txt_notification y como segundo parámetro la cadena de texto que queremos contenga el mensaje.

Para asignar estos parámetros visuales a la notificación, utilizamos el parámetro contentView del objeto Notification la cual representa la vista expandida del mensaje en la status bar.

Por último, asignamos la notificación al NotificationManager pasándole el ID que definimos en el paso anterior y el objeto notification.

7. Para que todo esto funcione cuando presionamos el botón de la actividad principal escribimos el siguiente código que corresponde al contenido del método onCreate():

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btn = (Button)findViewById(R.id.btn_notification);

        btn.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Timer timer = new Timer();
                TimerTask timerTask = new TimerTask()
                {
                    @Override
                    public void run()
                    {
                        triggerNotification();
                    }
                };
                timer.schedule(timerTask, 3000);
            }
        });
    }

Aquí recuperamos la referencia al Button definido en el archivo main.xml e inmediatamente le asignamos un evento de tipo onClickListener. Usamos TimerTask para definir que la notificación deberá mostrarse 3 segundo después de que se presione el botón. Con esto simplemente hacemos la llamada al método triggerNotification() que hemos creado en el paso anterior y que hace todo el trabajo por nosotros.

8. Corremos entonces nuestra aplicación:

Vista inicial de nuestra actividad.

Mensaje que se despliega cuando la notificación aparece en la status bar.

Así luce nuestra notificación personalizada.

No olvides que también puedes utilizar luces de LED o la vibración del teléfono como funciones que acompañen a tus notificaciones pero eso sí, piensa en que no resulte perturbador para el usuario, o incluso, podrías considerar darle al usuario la oportunidad de elegir si las notificaciones de tu aplicación las quiere compañar con algún sonido u otra característica a través de una ventana de configuración.

Descárgate el código fuente de este tutorial:

Referencia | Android developers | Giant Flying Saucer

 

¿Te fue útil este post? ¡Compártelo!

 

Comparte este post

Acerca de: Condesa

Desarrolladora de aplicaciones Android, freelance, apasionada de la tecnología, y precursora del crecimiento tecnológico en México.

Sígueme en Twitter

Leer todos mis artículos

También puede interesarte

Comentarios de este artículo

  • Anonymous

    Excelente voy a probar este ejemplo Gracias.

  • Eddis

    Para hacer esto mismo que explicas en el post, pero que se lance el mensaje de alerta automaticamente por un canal rss como se podría hacer? Es decir yo creo una entra en un post y que llegue automaticamente a la aplicación.
    Gracias y un saludo!!

    • condesa

      Eso ya tiene que ver con push notifications, así que te recomiendo investigues del tema, en Stackoverflow hay muchas respuestas acerca de eso.

      Saludos.

  • Borja Giner

    Hola, estoy siguiendo el ejemplo para crear notificaciones. Funciona genial, pero mi duda es: ¿cómo puedo crear una notificación sin tener que declarar un Intent? Yo lo único que quiero es alertar al usuario, pero que no tenga que ir explícitamente a una actividad al hacer clic.

    Gracias de antemano.
    Saludos!

  • Fernando Vieira

    Buenas! muy bueno el tutorial! pero donde esta el codigo? porque soy un poco brutico y tengo un proyecto en la universidad y necesito hacer notificaciones, y queria partir de este ejemplo para poder empezar, porque realmente las notificaciones se tienen que hacer cuando cambie ciertos status en la BD, pero no veo el codigo para poder partir de esto si me puedes decir gracias de antemano.

  • http://www.facebook.com/markus.caballeroalfaro Markus Caballero Alfaro

    5. Dentro de la clase BarNotificationTestActivity que es el nombre de la actividad principal donde yo trabajaré defino una constante que es el ID que identificará a la notificación tal y como te muestro a continuación:


    No hay ninguna imagen ni nada y salta al paso 6.

    Porfa me indican como se declara y que valor se le asigna. Yo la declaré asi:

    int NOTIFICATION_ID;

    PD: mi aplicación sí corre, llegan notificaciones normal, pero sería bueno tener la forma correcta de hacerlo.

    • condesa

      Hola,

      Disculpa, creo que se me barrió esa parte, ya he actualizado el tutorial y el link hacia el código fuente.

      Gracias y saludos

  • Serva22

    Buenas noches Condesa.

    Muchas gracias por esta explicación, tu página más de una vez me ha ayudado mucho.

    Ya ejecute la aplicación en mi celular, pero después de que aparece la notificación en la status bar, la despliego y hago click sobre ella, esto hace que la aplicación se vuelva a abrir.

    ¿Como le hago para que al presionar la notificación ésta desaparezca?

  • http://www.facebook.com/agunin Agustin Nin

    Hola , muy buen tutorial , tengo una consulta , como puedo hacer que una notificación de estas se lance en una fecha dad por ejemplo a cierta hora y cierto día quiero que se lance una notificación , se puede hacer con esto?
    Saludos!

  • http://twitter.com/kaia_6 -Kaia n.n-

    Hora de intentarlo, gracias Condesa Sama n_n

  • Edgardo

    Hola, muy buen tutorial, que sucede cuando quiero utilizar estas librerias en un proyecto para Android 4 ?

    • xzinik

      están descontnuadas recien estoy aprendiendo android y me tope que si quiero hacer para android 2.3.3 o superior me molesta con que no use el constructor de Notification, ojala actualicen el tutorial

  • Jhon Blanco

    Hey como no agradecer, de la que haz salvado…. Gracias… muy buen tutorial.

  • Fany

    hola, como puedo hacer para que mi notificación se muestre diariamente a determinada hora?

  • loga

    Excelente tutorial, me ayudado de mucho, una duda es posible
    asociar un sonido a la notificación y donde guardaría el sonido mp3 que diga “nueva notificación”,
    saludos