En este tema, aprenderemos cómo manejar las notificaciones en una aplicación utilizando Firebase Cloud Messaging (FCM). Veremos cómo recibir y mostrar notificaciones, así como cómo personalizarlas para mejorar la experiencia del usuario.
Contenido
Recepción de notificaciones
Para manejar notificaciones en tu aplicación, primero necesitas configurar un servicio que escuche los mensajes entrantes. En Android, esto se hace extendiendo FirebaseMessagingService
.
Ejemplo de código
public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { // TODO: Manejar el mensaje recibido Log.d(TAG, "From: " + remoteMessage.getFrom()); // Verifica si el mensaje contiene datos if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); } // Verifica si el mensaje contiene una notificación if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } } }
Explicación
onMessageReceived(RemoteMessage remoteMessage)
: Este método se llama cuando se recibe un mensaje. Aquí puedes manejar tanto los datos como la notificación que contiene el mensaje.remoteMessage.getData()
: Obtiene los datos del mensaje.remoteMessage.getNotification()
: Obtiene la notificación del mensaje.
Manejo de notificaciones en primer plano
Cuando la aplicación está en primer plano, puedes mostrar una notificación personalizada utilizando NotificationManager
.
Ejemplo de código
private void sendNotification(String messageBody) { Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); String channelId = getString(R.string.default_notification_channel_id); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, channelId) .setSmallIcon(R.drawable.ic_stat_ic_notification) .setContentTitle(getString(R.string.fcm_message)) .setContentText(messageBody) .setAutoCancel(true) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0, notificationBuilder.build()); }
Explicación
Intent
: Define la actividad que se abrirá cuando el usuario toque la notificación.PendingIntent
: Es un contenedor para elIntent
que se ejecutará en el futuro.NotificationCompat.Builder
: Construye la notificación.NotificationManager
: Muestra la notificación.
Manejo de notificaciones en segundo plano
Cuando la aplicación está en segundo plano, FCM maneja automáticamente la visualización de la notificación. Sin embargo, puedes personalizar el comportamiento extendiendo FirebaseMessagingService
.
Ejemplo de código
@Override public void onMessageReceived(RemoteMessage remoteMessage) { if (remoteMessage.getNotification() != null) { sendNotification(remoteMessage.getNotification().getBody()); } }
Explicación
sendNotification(String messageBody)
: Llama al método para mostrar la notificación personalizada.
Personalización de notificaciones
Puedes personalizar las notificaciones para incluir imágenes, acciones y más.
Ejemplo de código
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, channelId) .setSmallIcon(R.drawable.ic_stat_ic_notification) .setContentTitle(getString(R.string.fcm_message)) .setContentText(messageBody) .setStyle(new NotificationCompat.BigPictureStyle() .bigPicture(imageBitmap)) .addAction(R.drawable.ic_action, getString(R.string.action_text), pendingIntent) .setAutoCancel(true) .setContentIntent(pendingIntent);
Explicación
setStyle(new NotificationCompat.BigPictureStyle().bigPicture(imageBitmap))
: Añade una imagen grande a la notificación.addAction(int icon, CharSequence title, PendingIntent intent)
: Añade una acción a la notificación.
Ejercicio práctico
Ejercicio
- Configura un servicio
FirebaseMessagingService
en tu aplicación. - Implementa el método
onMessageReceived
para manejar mensajes entrantes. - Personaliza una notificación para que incluya una imagen y una acción.
Solución
public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { if (remoteMessage.getNotification() != null) { sendNotification(remoteMessage.getNotification().getBody()); } } private void sendNotification(String messageBody) { Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); String channelId = getString(R.string.default_notification_channel_id); Bitmap imageBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.notification_image); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, channelId) .setSmallIcon(R.drawable.ic_stat_ic_notification) .setContentTitle(getString(R.string.fcm_message)) .setContentText(messageBody) .setStyle(new NotificationCompat.BigPictureStyle() .bigPicture(imageBitmap)) .addAction(R.drawable.ic_action, getString(R.string.action_text), pendingIntent) .setAutoCancel(true) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0, notificationBuilder.build()); } }
Explicación
Bitmap imageBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.notification_image)
: Carga una imagen desde los recursos.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(imageBitmap))
: Añade la imagen a la notificación.addAction(R.drawable.ic_action, getString(R.string.action_text), pendingIntent)
: Añade una acción a la notificación.
Conclusión
En esta sección, hemos aprendido cómo manejar notificaciones en una aplicación utilizando Firebase Cloud Messaging. Hemos visto cómo recibir y mostrar notificaciones, tanto en primer plano como en segundo plano, y cómo personalizarlas para mejorar la experiencia del usuario. Con estos conocimientos, estás listo para implementar notificaciones efectivas en tu aplicación. En el próximo módulo, exploraremos las características avanzadas de mensajería en la nube de Firebase.
Curso de Firebase
Módulo 1: Introducción a Firebase
Módulo 2: Autenticación de Firebase
- Introducción a la autenticación de Firebase
- Autenticación por correo electrónico y contraseña
- Autenticación de redes sociales
- Gestión de usuarios
Módulo 3: Base de datos en tiempo real de Firebase
- Introducción a la base de datos en tiempo real
- Lectura y escritura de datos
- Estructura de datos y reglas de seguridad
- Capacidades sin conexión
Módulo 4: Cloud Firestore
- Introducción a Cloud Firestore
- Modelo de datos de Firestore
- Operaciones CRUD
- Consultas avanzadas
- Reglas de seguridad
Módulo 5: Almacenamiento de Firebase
- Introducción al almacenamiento de Firebase
- Subida de archivos
- Descarga de archivos
- Metadatos de archivos y seguridad
Módulo 6: Mensajería en la nube de Firebase
- Introducción a la mensajería en la nube
- Envío de notificaciones
- Manejo de notificaciones
- Características avanzadas de mensajería
Módulo 7: Análisis de Firebase
Módulo 8: Funciones de Firebase
- Introducción a las funciones de Firebase
- Escritura de funciones
- Despliegue de funciones
- Activación de funciones
Módulo 9: Monitoreo de rendimiento de Firebase
- Introducción al monitoreo de rendimiento
- Configuración del monitoreo de rendimiento
- Análisis de datos de rendimiento
Módulo 10: Laboratorio de pruebas de Firebase
- Introducción al laboratorio de pruebas de Firebase
- Ejecución de pruebas
- Análisis de resultados de pruebas