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 el Intent 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

  1. Configura un servicio FirebaseMessagingService en tu aplicación.
  2. Implementa el método onMessageReceived para manejar mensajes entrantes.
  3. 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

Módulo 3: Base de datos en tiempo real de Firebase

Módulo 4: Cloud Firestore

Módulo 5: Almacenamiento de Firebase

Módulo 6: Mensajería en la nube de Firebase

Módulo 7: Análisis de Firebase

Módulo 8: Funciones de Firebase

Módulo 9: Monitoreo de rendimiento de Firebase

Módulo 10: Laboratorio de pruebas de Firebase

Módulo 11: Temas avanzados de Firebase

© Copyright 2024. Todos los derechos reservados