Programación Android, NotificationManager y NotificationCompat

Share if you like...Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0

En las últimas publicaciones hablamos sobre cómo crear un Service y cómo crear un BroadcastReceiver. Pero muchas veces, cuando utilicemos estos componentes, necesitaremos que se avise al usuario por medio de una notificación en la barra de notificaciones del terminal, bien al terminar un Service, bien al recibir una llamada al BroadcastReceiver.

La clase NotificationManager, en Android, es la clase que se encarga de gestionar las notificaciones que se deben mostrar en la barra de notificaciones del terminal. Para poder mostrar una notificación, por lo tanto, necesitaremos crear un objeto de esta clase y configurar los parámetros necesarios de la notificación que queremos mostrar.

Para explicar su uso vamos a crear un ejemplo en el que, al pulsar un botón, vamos a iniciar un Service, para que simulará un trabajo de 10 segundos,  y al terminar muestre una notificación. También aprovecharemos el ejemplo de la publicación del BroadcastReceiver para generar una notificación cada vez que pongamos a cargar el terminal.

Nuestra Activity tendrá que implementar tan sólo el evento onClick del botón que debe lanzar el Service:

public void activarServicio(View v) {
	Intent service = new Intent(this, MyService.class);

	startService(service);
}

Crear el NotificationManager

Una vez hecho esto, y antes de crear el servicio, vamos a explicar cómo utilizar la clase NotificationManager. Para poder inicializar un objeto de esta clase, debemos solicitar al sistema que nos entregue este servicio, por medio del método getSystemService(String service), que devuelve el manejador del sistema para el servicio que indiquemos como parámetro. Es decir, al solicitar, pasando como parámetro al método Context.NOTIFICATION_SERVICE, el método devolverá el propio NotificationManager del sistema, por lo que sólo tendremos que hacer un casting a NotificationManager del objeto que devuelve para asignar el valor a nuestra instancia de esta clase. Veamos el ejemplo creando nuestra clase Service:

public class MyService extends Service {
	private static final String TAG = "MyService";

	@Override
	public IBinder onBind(Intent i) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int onStartCommand(final Intent intent, int flags, int startId) {

		new Thread(new Runnable() {

			@Override
			public void run() {
				Log.d(TAG, "FirstService started");
				// El servicio se finaliza a sí mismo cuando finaliza su
				// trabajo.
				try {
					// Simulamos trabajo de 10 segundos.
					Thread.sleep(10000);

					// Instanciamos e inicializamos nuestro manager.
					NotificationManager nManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

					Log.d(TAG, "sleep finished");
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		}).start();

		this.stopSelf();
		return super.onStartCommand(intent, flags, startId);
	}
}

Crear la notificación con NotificationCompat

Ahora nos centraremos en la parte del código en la que hemos creado el NotificationManager, y vamos a crear una notificación para mostrar. Para esto vamos a necesitar crear una notificación, que hasta ahora, se hacía a través de la clase Notification. Sin embargo, con las últimas versiones que se han sacado de Android, muchos métodos se han marcado como obsoletos, y podrían dejar de funcionar en cualquier momento, mientras que si utilizamos los métodos últimos estaremos restringiendo nuestra aplicación para que sólo pueda utilizarse en las últimas versiones. Por esto, yo voy a explicar cómo usar la clase NotificationCompat, que se sacó precisamente para evitar estos problemas, ganando compatibilidad con versiones antiguas de Android, sin tener métodos obsoletos. En primer lugar necesitamos crear un objeto Builder de la propia clase NotificationCompat, y en la propia inicialización del builder añadiremos los parámetros que queremos mostrar en nuestra notificación, como icono, título, mensaje y hora de la notificación:

NotificationCompat.Builder builder = new NotificationCompat.Builder(
		getBaseContext())
		.setSmallIcon(android.R.drawable.ic_dialog_info)
		.setContentTitle("MyService")
		.setContentText("Terminó el servicio!")
		.setWhen(System.currentTimeMillis());

Asignar la notificación al NotificationManager

Por último sólo nos queda mostrar la notificación, y para eso utilizaremos el método notify() del NotificationManager, que pedirá un ID, y una notificación:

nManager.notify(12345, builder.build());

A continuación definiremos el Service en el manifest.xml de nuestro proyecto, e indicaremos que el proceso se ejecute en remoto, para que al cerrar la aplicación no se cancele el servicio y pueda seguir trabajando:

<service
    android:name="com.proyectosimio.examplenotification.service.MyService"
    android:process="remote" />

Y con esto podremos abrir la aplicación, lanzar nuestro servicio y volver a cerrarla. Pasados los 10 segundos veremos que en nuestra barra de notificaciones aparecerá la notificación de que ha finalizado nuestro servicio:

NotificationManager
Notificación

En la próxima publicación terminaremos el ejemplo, añadiendo el BroadcastReceiver y haciendo que al pulsar sobre nuestra notificación se abra automáticamente la pantalla principal de nuestra aplicación.

Descargas

Puedes descargar el proyecto completo aquí.

Share if you like...Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0
The following two tabs change content below.
Reborn as IT Developer. Desarrollador Android y fundador de Proyecto Simio. "En realidad, yo no puedo enseñar nada a nadie, sólo puedo hacerles pensar." - Sócrates.

7 thoughts on “Programación Android, NotificationManager y NotificationCompat

  1. Una consulta, no se como hacer lo siguiente. Quiero saber con android studio cuando recibo una notificación de WhatsApp. Asi cargo una variable con el valor 5. O sea si me podes dar una idea o algun link donde pueda capturar al vuelo una notificación de WhatsApp cuando llega. Intente realizarlo con un broadcast receiver… Pero no pude gracias

    1. Ahora mismo no puedo recordar si existe algún tipo de timeout para las notificaciones.
      Si no es así, se me ocurre crear una alarma que cuando se lance elimine esa notificación.

    1. Si a lo que te refieres es a usar la propia notificación del sistema para ponerla dentro de tu layout, la respuesta es que no. Tendrías que crear tú mismo la estructura (usando ImageView y TextView) para imitar la misma apariencia y gestionarlo por ti mismo todo, pero sin usar notificaciones (cuya finalidad es totalmente distinta a lo que comentas).

      Un saludo.

Deja un comentario