web-dev-qa-db-fra.com

Ouvrir une activité spécifique lorsque la notification est cliquée dans FCM

Je travaille sur une application dans laquelle je suis tenu de présenter une notification . Pour notification, j'utilise FireBase Cloud Messaging (FCM) . Je peux recevoir une notification lorsque l'application est en arrière-plan.

Mais lorsque je clique sur notification, il est redirigé vers home.Java page. Je veux qu'il redirige vers Notification.Java page.

Alors, dites-moi comment spécifier l'activité dans le clic de notification . J'utilise deux services: 

1.) MyFirebaseMessagingService

2.) MyFirebaseInstanceIDService

Voici mon exemple de code pour la méthode onMessageReceived () de la classe 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;

    }
}
13
Arman Reyaz

Avec FCM, vous pouvez envoyer deux types de messages aux clients:

1. Messages de notification: est parfois considéré comme un "message d'affichage".

FCM affiche automatiquement le message aux périphériques des utilisateurs finaux pour le compte de l'application client. Les messages de notification ont un ensemble prédéfini de clés visibles par l'utilisateur. 

2. Messages de données: qui sont gérés par l'application cliente.

L'application client est responsable du traitement des messages de données. Les messages de données ont uniquement des paires clé-valeur personnalisées.

Selon le document FCM Recevoir des messages dans une application Android

  • Notifications livrées lorsque votre application est en arrière-plan. Dans ce cas, la notification est transmise à la barre d'état système du périphérique. Un utilisateur tapant sur une notification ouvre le lanceur d'applications par défaut.
  • Messages avec notification et données utiles, à la fois en arrière-plan et en avant-plan. Dans ce cas, la notification est remise au destinataire.
    dans la barre d'état système de l'appareil et la charge utile de données est livrée dans les extras de l'intention de votre activité de lanceur.

Set click_action dans la charge de notification:

Donc, si vous voulez traiter les messages arrivés en arrière-plan, vous devez envoyer click_action avec le message. 

click_action est un paramètre de la charge de notification

Si vous souhaitez ouvrir votre application et effectuer une action spécifique, définissez click_action dans la charge de notification et associez-le à un filtre d'intention dans l'activité que vous souhaitez lancer. 

Par exemple, définissez click_action sur OPEN_ACTIVITY_1 pour déclencher un filtre d'intention semblable à celui-ci:

<intent-filter>
  <action Android:name="OPEN_ACTIVITY_1" />
  <category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>

La charge utile de la FCM ressemble à celle ci-dessous:

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

Lorsque l'application est en arrière-plan, l'intention doit être livrée dans votre activité de lancement. Elle ouvre donc votre activité de lancement. À présent, vérifiez si des données sont présentes dans l'activité de lancement dans l'activité de lancement puis démarrez l'activité requise.

4
ak0692

AndroidManifest.xml

<activity Android:name="YOUR_ACTIVITY">
    <intent-filter>
        <action Android:name="com.example.yourapplication_YOUR_NOTIFICATION_NAME" />
        <category Android:name="Android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Votre fichier FirebaseMessagingService.Java sur la méthode onMessageReceived:

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());
}

Votre fonction cloud/code serveur de notification:

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

Ouvrir MyFirebaseMessagingService.Java fichier

à l'intérieur de ce fichier, il y a une méthode sendNotification () , vous devez spécifier votre activité à laquelle vous devez accéder dans l'intention, comme indiqué ci-dessous 

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

si vous envoyez plusieurs notifications et que vous souhaitez accéder à différentes activités en cliquant sur une notification donnée, vous pouvez utiliser n'importe quelle instruction conditionnelle pour la réaliser. Ma suggestion est d'utiliser un switch case comme indiqué ci-dessous

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);
}

En utilisant cette logique, vous pouvez ouvrir une activité spécifique sur Notification click dans FCM . Cela fonctionne parfaitement pour moi . Merci. 

1
Darshuu