Crear Notificaciones en Android

Buenos días, en este tutorial vamos a ver como podemos usar las notificaciones en Android.


Hasta ahora hemos usado la clase Toast para mostrar mensajes al usuario. La clase Toast es una manera fácil de mostrar alertas al usuario, pero no es persistente, aparece en la pantalla por unos pocos segundos y a continuación deseparece, lo que puede ser un problema si por casualidad el usuario no está mirando a la pantalla.

Para mensajes de mas importantes, deberíamos usar un método mas persistente. En este caso vamos a usar la clase NotificationManager para mostrar un mensaje en la status bar, o como tambien es conocida notification bar.

Lo que vamos a crear, va a ser una aplicación en la que pulsando un botón, lanzaremos una notificación a la barra de notificaciones mostrando un texto, y cuando despleguemos la barra de notificaciones veremos un mensaje mas detallado sobre lo que hemos lanzado.

Con esta pequeña introducción, vamos a ponernos manos a la obra:

  • Creación de Proyecto Android

    Para empezar, vamos a crear un proyecto en Android, y para ello en Eclipse vamos a dirigirnos a File -> New -> Android Application Project. En caso de que no lo encontremos en la lista, vamos a “Other”, y bien lo buscamos a mano, o introducimos Android en la caja de texto, filtrandose así los resultados que contengan Android en su nombre.

    Una vez entremos en el Asistente, vamos a establecer un nombre al proyecto, en mi caso lo he llamado EjemploNotificacion, pero podeis darle el que querais. El resto de opciones los podemos dejar como están.

    Cuando sigamos avanzando hasta encontrar la ventana en la que se nos pregunta por el nombre de nuestra Activity principal, la llamaremos NotificationActivity, o el nombre que querais. Su layout, se llamará en mi caso activity_notification_example.xml.

  • NotificationActivity.java

    Una vez creado nustro proyecto, tendremos nuestra clase Activity creada satisfactoriamente, junto con su layout en la carpeta res/layout. A continuación vemos el código que definirá el aspecto de nuestra Activity:

    		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    		    xmlns:tools="http://schemas.android.com/tools"
    		    android:layout_width="match_parent"
    		    android:layout_height="match_parent"
    		    android:orientation="vertical"
    		    tools:context=".NotificationExample" >
    		
    		    <Button
    		        android:id="@+id/btnMostrarNotificacion"
    		        android:layout_width="fill_parent"
    		        android:layout_height="wrap_content"
    		        android:onClick="onClick"
    		        android:text="Mostrar Notificacion" />
    		
    		</LinearLayout>
    		

    Como podemos ver, no tiene demasiada dificultad, solo hemos implementado un Button el cual lanzará la Notificación.

    A continuación, vamos a ver el código java de nuestra clase NotificationActivity.java, el cual se encuentra en la carpeta src/package-name/NotificationActivity.java:

    		public class NotificationActivity extends Activity {
    			int notificationID = 1;
    			
    			@Override
    			protected void onCreate(Bundle savedInstanceState) {
    				super.onCreate(savedInstanceState);
    				setContentView(R.layout.activity_notification_example);
    			}
    			
    			public void onClick(View v){
    				displayNotification();
    			}
    			
    			protected void displayNotification(){
    				Intent i = new Intent(this, NotificationView.class);
    				i.putExtra("notificationID", notificationID);
    				
    				PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0);
    				NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    				
    				CharSequence ticker ="Nueva entrada en SekthDroid";
    				CharSequence contentTitle = "SekthDroid";
    				CharSequence contentText = "Visita ahora SekthDroid!";
    				Notification noti = new NotificationCompat.Builder(this)
    										.setContentIntent(pendingIntent)
    										.setTicker(ticker)
    										.setContentTitle(contentTitle)
    										.setContentText(contentText)
    										.setSmallIcon(R.drawable.ic_launcher)
    										.addAction(R.drawable.ic_launcher, ticker, pendingIntent)
    										.setVibrate(new long[] {100, 250, 100, 500})
    										.build();
    				nm.notify(notificationID, noti);
    			}
    		
    		}
    		

    Vamos a analizar bien todo lo que hemos usado:

    • public void onClick(View v)

      En este método vamos a hacer una llamada al método que va a preparar nuestra notificación y que a continuación va a lanzarla.

    • protected void displayNotification()

      En este método estará la parte mas importante de nuestra aplicación.

      Lo primero que haremos es crear un objeto Intent el cual contiene la referencia a la actividad actual y a la que iremos mas tarde, en este caso, es la segunda Activity que vamos a crear. A este mismo Intent, le vamos a agregar el ID de la notificacion, ya que luego en la siguiente actividad, usaremos este ID para cancelarla y eliminarla de la barra de notificaciones.

      				Intent i = new Intent(this, NotificationView.class);
      				i.putExtra("notificationID", notificationID);
      				

      Ahora creamos otro Intent, en este caso pertenece a la clase PendingIntent. Estos Intent nos ayudan a realizar una acción en nuestra aplicación, incluso mas tarde, sin importar si nuestra aplicación se está ejecutando o no, y la inicializamos con el context de la aplicación, un request code para el intent, el intent para lanzar la aplicación objetivo y flag que especifica en que actividad será lanzada.

      				PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0);
      				

      El paso siguiente es obtener la instancia de la clase NotificationManager, la cual usaremos para lanzar luego nuestra Notificacion.

      				NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
      				

      Ahora vamos a crear un objeto de la clase Notification, cuya construcción vamos a crear mediante el Builder de la clase NotificationCompat, el cual es el usado para dispositivos android cuya versión es inferior a API 11, es por ello que hemos importado con anterioridad la librería de soporte. En el caso de que nuestra aplicación solo sea para dispositivos con una versión de Android superior a la API 11, podemos usar Notification.Builder para construir la Notification. Esta es la única diferencia.

      				Notification noti = new NotificationCompat.Builder(this)
      								.setContentIntent(pendingIntent)
      								.setTicker(ticker)
      								.setContentTitle(contentTitle)
      								.setContentText(contentText)
      								.setSmallIcon(R.drawable.ic_launcher)
      								.addAction(R.drawable.ic_launcher, ticker, pendingIntent)
      								.setVibrate(new long[] {100, 250, 100, 500})
      								.build();
      				

      Dicho esto vamos a establecer una serie de parámetros a nuestra Notificacion:

      • setcontentIntent(): Con este método establecemos el PendingIntent que antes declaramos el cual nos ayudará a lanzar la Activity objetivo.
      • setTicker(): En este método establecemos el título de la notificación que se mostrará al llegar la notificación, es decir, el mensaje que sale antes de desplegar la barra de notificaciones.
      • setContentTitle(): Aquí establecemos el título del mensaje de nuestra notificación, la que aparece cuando abrimos la barra de notificaciones.
      • setContentText(): on este otro método establecemos una descripción mas amplia de la notificación que hemos lanzado cuando abrimos la barra de notificaciones.
      • setSmallIcon(): Con este método establecemos el icono para nuestra notificación.
      • addAction(): Con esto vamos a añadir una acción a la notificación.
      • setVibrate():: Por último vamos a agregar una vibración a nuestra notificación, como vemos el argumento es un array de long. El primer valor indica el número de segundos que esperará hasta lanzar la vibración, el segundo argumento hará que vibre durante 250ms, el tercer argumento es otra parada de 100ms, y como último argumento volverá a vibrar durante 500ms.
      • build(): Con este método queda construida nuestra Notification.

      Como último en esta actividad, añadimos una notificación al NotificationManager, pasando como argumentos el ID de la notificacion y el objeto Notification que hemos construido.

      				nm.notify(notificationID, noti);
      				
  • NotificationView.java

    Aunque nuestra Activity NotificationActivity ya es funcional, la notificación nos va a enviar a otra Activity, en la que podremos consultar todo lo relacionado con el aviso de nuestra notificación. En este caso solo vamos a abrir la Activity, y cancelaremos la Notificación, ya que la daremos por consumida.

    Entonces, vamos a crear nuestra segunda clase java, llamada NotificationView.java, e inmediatamente crearemos un archivo xml a la carpeta res/layout, para que podamos asignarle una UI a esta actividad:

    		<?xml version="1.0" encoding="utf-8"?>
    		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    		    android:layout_width="match_parent"
    		    android:layout_height="match_parent"
    		    android:orientation="vertical" >
    		
    		    <TextView
    		        android:layout_width="fill_parent"
    		        android:layout_height="wrap_content"
    		        android:text="Aqui detalles de la notificacion" />
    		
    		</LinearLayout>
    		

    Como vemos, solo tenemos un TextView, que usamos para indicar que hemos abierto el “contenido” de la notificación.

    Su código java, sin embargo, si hace algo más:

    		public class NotificationView extends Activity {
    
    			@Override
    			protected void onCreate(Bundle savedInstanceState) {
    				// TODO Auto-generated method stub
    				super.onCreate(savedInstanceState);
    				setContentView(R.layout.notification);
    		
    				NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    		
    				// Cancelamos la Notificacion que hemos comenzado
    				nm.cancel(getIntent().getExtras().getInt("notificationID"));
    			}
    		
    		}
    		

    En esta actividad se vuelve a instanciar el NotificationManager, para poder cancelar la notificación cuyo ID trae el Intent que habíamos pasado, el cual podemos obtener mediante los métodos getInten().getExtras().getInt(), en el cual pasamos como argumento el key del ID que pusimos antes.

    Una vez entremos en esta actividad, nuestra notificación desaparecerá de la barra de notificaciones.

Esta es una manera simple de usar las notificaciones en Android, y hemos aprendido a como crear una notificación y lanzarla a nuestra barra de aplicaciones, acompañandola de una descripción y una vibración.

A continuación vemos unas capturas de pantalla sobre nuestra notificación:

Principal Notification Notification Alert Opened Notification NotificationView

Un vídeo que nos muestra la aplicación siendo ejecutada:


Ahora podemos agregar las Notificaciones a nuestras aplicaciones con este método, el cual no es del todo muy dificil, y queda bastante bien.

El código de ejemplo de este ejemplo puedes descargarlo de aquí.

Sin más, cualquier corrección o aporte es bienvenido.

Saludos!!!

  • Enmanuel

    Hola David.
    Lo que me pasa no es un problema, sino más bien, un detalle a pulir.
    Este ejemplo aplicado a mi aplicación, funciona perfectamente.
    Digamos que yo ya estoy en mi “pendingIntent”, llega una notificación, la abro, y vuelve a abrir otra vez la activity que ya tenía abierta.
    ¿Sabes qué puedo hacer para que cuando esté en una activity determinada la notificación no la abra?

    Un saludo.

    • Buenas Enmanuel,

      Leí sobre ello al poco de crear el tutorial y hubiera sido buena idea añadirlo, pero se me olvidó completamente.

      Creo que uno de los métodos para realizar esto es ir al AndroidManifest.xml y en la Activity en cuestión agregar una línea:

      android:launchMode="singleTop"
      

      Debe de ser un elemento de la etiqueta , y esto en teoría hace posible que solo sea posible una instancia de una misma Activity. Lo que no te puedo decir ahora mismo es si cerrará la actual y la creará con los datos de la Notificación o hará alguna otra cosa rara, así que por este lado no puedo serte mucho de ayuda.

      Espero que te sirva!

      Saludos!!

      • Enmanuel

        Funciona perfecto, muchas gracias David.

  • ricardo

    Excelente tutorial, solo una consulta, ¿se puede agregar un sonido a la notificación?

    • Buenas Ricardo,

      Si se puede, poniendo esta línea reproducirás un sonido:

      .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
      

      Por lo que el código de la creación quedaría tal que así:

      Notification noti = new NotificationCompat.Builder(this)
                                      .setContentIntent(pendingIntent)
                                      .setTicker(ticker)
                                      .setContentTitle(contentTitle)
                                      .setContentText(contentText)
                                      .setSmallIcon(R.drawable.ic_launcher)
                                      .addAction(R.drawable.ic_launcher, ticker, pendingIntent)
                                      .setVibrate(new long[] {100, 250, 100, 500})
                            .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                                      .build();
      

      Espero que te sea de ayuda!

      Saludos!!!

  • loga

    Excelente tutorial, me ayudado de mucho, una duda es posible agrega un audio, ejemplo “nueva alerta”. Saludos

  • Fantástico trabajo… mi gracias…

    Una pregunta… que estoy enfrascado y no salgo…

    Es posible en .addAction(R.drawable.ic_launcher.. cargar una imagen cualquiera de la galeria por ejemplo¿?

  • Pepe
  • Daniel

    Hola David.
    Me podrías ayudar, como puedo poner un determinado mes día y hora para que se lance el mensaje. Tal vez lo tome del calendario?

    Un Saludo.

    • Gama

      Hola has encontrado algo acerca de esto, yo encontre esto .setWhen() pero no puedo utilizarlo, agradeceria tu ayuda 😀

  • Hola espero y me ayuden con esto,quisiera crear una app como esta que muestran pero que las notificaciones muestren nuevos avisos como podría hacerlo? espero su respuesta Gracias(=