Alertas y notificaciones en Android

Buenas, los programadores normalmente nos estamos preocupando de que nuestro código se vea lo más simple posible, que sea eficiente y que funcione bien para obtener nuestro objetivo una aplicación robusta y con el menor número de fallos. Pero es tal nuestra obsesión por que todo esto quede bien que muchas veces nos olvidamos de un tema aún más importante, la información que le damos al usuario.



Es tan importante que un proceso se ejecute correctamente como informar al usuario. Para ello Android provee diferentes métodos con los que poder tener al usuario en todo momento informado de lo que está sucediendo.


El método más sencillo para notificaciones son las Toast, estas son ventanas emergentes que muestran un mensaje durante un corto período de tiempo y luego desaparecen automáticamente. Mostrar una de estas es muy sencillo, basta con una única línea haciendo uso de la clase Toast.


Toast.makeText(this, "mensaje", Toast.LENGTH_LONG).show();


Lo único que debéis tener en cuenta es el primer parámetro de makeText, si lo utilizáis en una Activity basta con que pongáis this, pero si lo utilizáis en una clase a parte debéis pasarle el context correspondiente para poder mostrarla.


Otra forma de notificar al usuario son las notificaciones en la barra de estado, normalmente las vemos cuando tenemos llamadas perdidas, nos llega un correo electrónico, nos mandan un mensaje, etc...
Estas notificaciones normalmente aparecen en la barra de estado con un icono y un mensaje, al desplegar el mensaje aparece una breve descripción y la hora de la notificación.
La forma de utilizarlas es un poco más elaborado que la anterior pero no es complicado.
Primero hacemos referencia al servicio de notificaciones, para ello instanciamos un objeto NotificationManager:


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


Después creamos una notificación y la configuramos con el mensaje de estado, icono, hora. He utilizado un icono del API de Android, pero podéis utilizar uno personalizado.


Notification notificacion = new Notification(android.R.drawable.sym_call_missed, "Llamada perdidad", System.currentTimeMillis());


Ahora vamos a crear y configurar la descripción y mensaje de la notificación, así como el Intent para poder abrir la aplicación desde la notificación. Estoy haciendo el ejemplo sobre el código del lector de JSON por esto estoy abriendo la activity ReadWebServiceActivity, vosotros abriréis la que necesitéis.


Intent notificacionIntent = new Intent(getApplicationContext(), ReadWebServiceActivity.class);         
PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, notificacionIntent, 0);         
notificacion.setLatestEventInfo(getApplicationContext(), "Llamada perdida", "Tienes una llamada perdida del número 666777888.", contentIntent);


Y por último lanzamos la notificación. No he dicho nada sobre NOTIF_ALERTA_ID, es un variable privada de tipo int, y su valor le ponéis el que vosotros queráis.


notificador.notify(NOTIF_ALERTA_ID, notificacion);


Otro de los métodos de notificación son los diálogos de progreso, son aquellos que se muestran mientras se está realizando un proceso y es necesario que el usuario espere mientras acaba, por ejemplo una descarga. Podeís ver un ejemplo de esto en el código que subimos la semana pasada del ejemplo del lector JSON. Al iniciar la descarga se activa una ventana modal y el usuario no puede hacer nada, y al terminar se cierra esta.

Os pongo aquí como sería la apertura y cierre de esta ventana, pero para verlo realmente funcionando echarle un ojo al código que os mencione antes:


ProgressDialog progressDialog = ProgressDialog.show(getApplicationContext(), "Descargando información", "Por favor espere",true);

progressDialog.dismiss();


El último de los métodos que os voy a mencionar son las ventanas de diálogo. Estas ventanas son utilizadas para informar al usuario, pero normalmente aparece un botón para confirmar/continuar o dos uno para confirmar y otro para cancelar. También se puede complicar un poco más y mostrarle al usuario una serie de opciones para que seleccione una de ellas.


AlertDialog.Builder dialogo = new AlertDialog.Builder(this);
        
dialogo.setTitle("Título");
dialogo.setMessage("¿Deseas continuar?");
dialogo.setPositiveButton("Sí", new OnClickListener() {
   public void onClick(DialogInterface dialog, int which) {
       dialog.cancel();
   }
});
dialogo.setNegativeButton("No", new OnClickListener() {
   public void onClick(DialogInterface dialog, int which) {
       dialog.cancel();
   }
});
     
dialogo.create();
         
dialogo.show();


Crear una ventana de diálogo es muy simple, simplemente instanciamos un AlertDialog y lo configuramos. Si solo queréis que tenga un botón de confirmar basta con quitar setNegativeButton. Por otro lado, al final de todo, hay que crear la ventana y mostrarla, no bastaría con el método show. Por último, aquí lo que se está haciendo en los eventos de los botones es cerrar la ventana de diálogo, pero vosotros haréis el proceso que necesitéis.

La otra variante de estas notificaciones, sería mostrar una serie de opciones para que el usuario seleccione la que quiera. Las opciones en este caso son un array de tipo String, y para acceder a la selección del usuario lo hacemos a través del OnClickListener, el cual nos devuelve el índice del array seleccionado. Luego podemos mostrarlo como hago yo con un Toast o hacer lo que más os convenga.


Aquí sigo utilizando el código del lector de json, por eso le indico que el context es ReadWebServiceActivity.this.


final String[] items = {"No", "SinMi", "Ubuntu"};
        
AlertDialog.Builder dialogo = new AlertDialog.Builder(this);
     
dialogo.setTitle("Selecciona una opción");
dialogo.setItems(items, new DialogInterface.OnClickListener() {
   public void onClick(DialogInterface dialog, int item) {
      Toast.makeText(ReadWebServiceActivity.this, items[item], Toast.LENGTH_LONG).show();
   }
});
     
dialogo.create();
dialogo.show();


Como veis, hay multitud de formas de informar al usuario de lo que está pasando en la aplicación. Como os decía esto es muy importante, casi tanto como que funcione la aplicación, porque si el usuario no sabe lo que pasa al final acabará por desinstalar la aplicación por muy bien que funcione.

A parte de esto, Android nos da muchísimas más opciones para configurar estas notificaciones, pero como iniciación es bastante, ahora os toca a vosotros experimentar y personalizar vuestras notificaciones como mejor os parezca.



Aviso
Hace poco publicamos un artículo sobre como mejorar el rendimiento en bases de datos SQLite, pues bien, uno de nuestros lectores nos alerto de un error en la aplicación que impedia que una vez descargado el json se insertara en base de datos. Hemos comentado y actualizado este artículo para que podais ejecutar el código correctamente.

Comments are closed.