Las notificaciones de la barra de estado

Puedes ver una explicaión de esta sección en formato poli[Media]

Notificaciones en Android

La barra de estado de Android se encuentra situada en la parte superior de la pantalla. La parte izquierda de esta barra está reservada para visualizar notificaciones. Cuando se crea una nueva notificación, aparece un texto desplazándose en la barra, y a continuación, un pequeño icono permanecerá en la barra para recordar al usuario la notificación.

El usuario puede arrastrar la barra de notificaciones hacia abajo, para mostrar el listado de las notificaciones por leer. Un posible ejemplo se muestra a continuación:

Una notificación puede ser creada por un servicio o por una actividad. Aunque dado que la actividad dispone de su propio interfaz de usuario, parece que las notificaciones son el mecanismo de interacción más interesante del que disponen los servicios. Las notificaciones pueden crearse desde un segundo plano, sin interferir con la actividad que en ese momento esté utilizando el usuario.

 

Ejercicio paso a paso: Las notificaciones de la barra de estado

1. Abre el proyecto ServicioMusica.

2. Declara las siguientes variables al comienzo de la clase:

private NotificationManager nm;  

private static final int ID_NOTIFICACION_CREAR = 1;

3. Vamos a obtener una referencia al NotificationManager del sistema.  Para ello, declara las siguientes variables y añade al método onCreate() la siguiente línea:

  nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);       

4. Vamos a crear una nueva notificación. Añade en el método onStartCommand() la siguiente línea:

     

Notification notificacion = new Notification(

                        R.drawable.icon,

                        "Creando Servicio de Música",

                        System.currentTimeMillis() );

Como puedes ver, en el constructor de una notificación hay que indicar 3 parámetros: el icono a visualizar (en el ejemplo usamos el mismo que el de la aplicación. NOTA: En MOTODEV se llamaic_laucher), el texto a mostrar y la fecha que se visualizará asociada a la notificación (en el ejemplo indicamos que ahora mismo).

5. Define información adicional que será utilizada en la ventana de notificaciones. Esta información incluye el mensaje expandido y la actividad a ejecutar cuando se pulse sobre la notificación:

PendingIntent intencionPendiente = PendingIntent.getActivity(
          this, 0, new Intent(this, ActividadPrincipal.class), 0);

notificacion.setLatestEventInfo(this, "Reproduciendo música",

       "información adicional", intencionPendiente);

Cuando el usuario abra la ventana de notificaciones, podrá ver información adicional formada por un título y un texto explicativo. Además se podrá asociar una actividad para que se ejecute cuando el usuario pulse sobre la notificación. En el ejemplo se crea un PendingIntent asociado a la actividad ActividadPrincipal. Por supuesto, también puedes crear una nueva actividad para usarla exclusivamente con este fin. En un ejemplo más complejo, puedes pasar los parámetros adecuados a través del Intent, para que la actividad conozca los detalles específicos que provocaron la notificación (por ejemplo, el número de teléfono que provocó la llamada perdida). 

Una notificación puede tener otros parámetros, por ejemplo, puede reproducir un sonido, puede hacer vibrar el teléfono o puede hacer parpadear un LED del teléfono. Puedes consultar el siguiente punto si estás interesado en alguno de estos aspectos.

6. Vamos a pasar la notificación creada al NotificationManager. Para ello añade:

       nm.notify(ID_NOTIFICACION_CREAR, notificacion);      

       ... // resto de código de onStartCommand()

7. Queremos que si el servicio deja de estar activo, eliminamos la notificación. Para ello añade en onDestroy():

nm.cancel(ID_NOTIFICACION_CREAR);

Este paso es opcional. Muchas notificaciones han de permanecer visibles aunque el servicio que las creo sea destruido. En nuestro caso, dado que estamos anunciando que un servicio de reproducción de música está activado, la notificación deja de tener sentido al desaparecer el servicio.

Práctica: Uso del servicio de música en Asteroides

  1. Copia la clase ServicioMusica realizada en el ejercicio anterior al proyecto Asteroides.
  2. Corrige los errores que hayan aparecido para adaptarla al nuevo proyecto. NOTA: Mantén la versión del SDK de Asteroides en 1.6.
  3. En el ejercicio anterior, cuando se visualiza los detalles de la notificación en el ejercicio anterior se podía lanzar la actividad ActividadPrincipal.  Modifica el código para que se lace la actividad Asteroides.
  4. Si realizas el punto anterior simplemente lanzando la actividad Asteroides, cuando el usuario pulse sobre la notificación el sistema lanzará una nueva tarea, aunque ya exista una previa. Si te interesa que no se lance una nueva tarea cuando ya exista una previa añade la línea en negrita en AndroidManifest.xml

 <activity

            android:name=".Asteroides"

            android:label="@string/app_name"

            android:launchMode="singleTask">

  1. Lanza el servicio en el método onCreate() de la actividad Asteroides. Para el servicio en el método onDestroy().