Abrir actividad específica cuando la notificación hizo clic en FCM

Estoy trabajando en una aplicación en la que debo mostrar una notificación. Para la notificación, estoy usando FireBase Cloud Messaging (FCM) . Puedo recibir notificaciones cuando la aplicación está en segundo plano.

Pero cuando hago clic en notificación, se redirige a la página home.java . Quiero que redirija a la página Notification.java .

Por lo tanto, dígame cómo especificar Actividad en el clic de la notificación. Estoy usando dos servicios:

1.) MyFirebaseMessagingService

2.) MyFirebaseInstanceIDService

Este es mi ejemplo de código para el método onMessageReceived () en la clase MyFirebaseMessagingService.

public class MyFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "FirebaseMessageService"; Bitmap bitmap; public void onMessageReceived(RemoteMessage remoteMessage) { Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. } /** * Create and show a simple notification containing the received FCM message. */ private void sendNotification(String messageBody, Bitmap image, String TrueOrFalse) { Intent intent = new Intent(this, Notification.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("Notification", TrueOrFalse); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setLargeIcon(image)/*Notification icon image*/ .setContentTitle(messageBody) .setStyle(new NotificationCompat.BigPictureStyle() .bigPicture(image))/*Notification with Image*/ .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); } /* *To get a Bitmap image from the URL received * */ public Bitmap getBitmapfromUrl(String imageUrl) { try { URL url = new URL(imageUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.connect(); InputStream input = connection.getInputStream(); Bitmap bitmap = BitmapFactory.decodeStream(input); return bitmap; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } 

Con FCM, puede enviar dos tipos de mensajes a los clientes:

1. Mensajes de notificación: a veces se los considera como “mensajes de visualización”.

FCM muestra automáticamente el mensaje a los dispositivos del usuario final en nombre de la aplicación del cliente. Los mensajes de notificación tienen un conjunto predefinido de claves visibles para el usuario.

2. Mensajes de datos: que son manejados por la aplicación del cliente.

La aplicación del cliente es responsable de procesar los mensajes de datos. Los mensajes de datos solo tienen pares de clave-valor personalizados.

De acuerdo con el documento de FCM, recibir mensajes en una aplicación de Android

  • Notificaciones entregadas cuando tu aplicación está en segundo plano. En este caso, la notificación se entrega a la bandeja del sistema del dispositivo. Un usuario toca en una notificación abre el iniciador de aplicaciones de manera predeterminada.
  • Mensajes con notificación y carga de datos, tanto de fondo como de primer plano. En este caso, la notificación se entrega al
    bandeja del sistema del dispositivo, y la carga útil de datos se entrega en los extras de la actividad de su iniciador.

Establezca click_action en la carga de notificación:

Por lo tanto, si desea procesar los mensajes que llegaron en segundo plano, debe enviar click_action con un mensaje.

click_action es un parámetro de la carga de notificación

Si desea abrir su aplicación y realizar una acción específica, establezca click_action en la carga de notificación y click_action a un filtro de intención en la actividad que desea iniciar.

Por ejemplo, establezca click_action en OPEN_ACTIVITY_1 para activar un filtro de intención como el siguiente:

     

La carga útil de FCM se ve a continuación:

 { "to":"some_device_token", "content_available": true, "notification": { "title": "hello", "body": "test message", "click_action": "OPEN_ACTIVITY_1" }, "data": { "extra":"juice" } } 

AndroidManifest.xml

       

Su método FirebaseMessagingService.java en el método deMessageReceived:

 public void onMessageReceived(RemoteMessage remoteMessage){ String title=remoteMessage.getNotification().getTitle(); String message=remoteMessage.getNotification().getBody(); String click_action=remoteMessage.getNotification().getClickAction(); Intent intent=new Intent(click_action); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_ONE_SHOT); NotificationCompat.Builder notificationBuilder=new NotificationCompat.Builder(this); notificationBuilder.setContentTitle(title); notificationBuilder.setContentText(message); notificationBuilder.setSmallIcon(R.mipmap.ic_launcher); notificationBuilder.setAutoCancel(true); notificationBuilder.setContentIntent(pendingIntent); NotificationManager notificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0,notificationBuilder.build()); } 

Su función de nube / código de servidor para la notificación:

  notification: { title: "TITLE OF NOTIFICATION", body: "NOTIFICATION MESSAGE", sound: "default", click_action: "com.example.myapplication_YOUR_NOTIFICATION_NAME" } 

Abra el archivo MyFirebaseMessagingService.java

dentro de ese archivo hay un método sendNotification () , allí debe especificar su actividad a la que debe navegar en el Intent como se muestra a continuación

 Intent intent = new Intent(this, YourActivityName.class); 

si está enviando notificaciones múltiples y desea navegar a diferentes actividades al hacer clic en una notificación en particular, puede usar cualquier statement condicional para lograrlo, mi sugerencia es usar una caja de conmutadores como se muestra a continuación.

 private void sendNotification(String messageBody, Bitmap image, String TrueOrFalse) { Intent intent = new Intent(); switch(condition) { case '1': intent = new Intent(this, ActivityOne.class); break; case '2': intent = new Intent(this, ActivityTwo.class); break; case '3': intent = new Intent(this, ActivityThree.class); break; default : intent = new Intent(this, DefaultActivity.class); break; } intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("Notification", TrueOrFalse); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT); } 

Usando esta lógica, puede abrir una actividad específica en Notificación, haga clic en FCM. Esto funciona perfectamente para mi. Gracias

Cuando la aplicación está en segundo plano, la intención debe ser entregada en tu actividad de iniciador. Por lo tanto, abre tu actividad de Iniciador. Ahora comprueba si hay datos en el Intento en la actividad del iniciador y luego comienza tu Actividad requerida.