Открыть конкретную активность, когда уведомление было нажато в FCM

Я работаю над приложением, в котором мне требуется показать уведомление. Для уведомления я использую FireBase Cloud Messaging (FCM). Я могу получить уведомление, когда приложение находится в фоновом режиме.

Но когда я нажимаю на уведомление, он перенаправляется на страницу home.java. Я хочу, чтобы он перенаправлялся на страницу Notification.java.

Итак, скажите, пожалуйста, как указать Activity in on Click of notification. Я использую две службы:

1.) MyFirebaseMessagingService

2.) MyFirebaseInstanceIDService

Это мой пример кода для метода onMessageReceived() в классе 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;

    }
}

Ответ 1

С помощью FCM вы можете отправлять клиентам два типа сообщений :

1. Уведомительные сообщения: иногда считается "отображением сообщений".

FCM автоматически отображает сообщение для устройств конечного пользователя от имени клиентского приложения. Уведомительные сообщения имеют предопределенный набор видимых пользователю ключей.

2. Сообщения данных:, которые обрабатываются клиентским приложением.

Клиентское приложение отвечает за обработку сообщений с данными. Сообщения данных имеют только пользовательские пары ключ-значение.

Согласно документу FCM Получать сообщения в приложении для Android

  • Уведомления доставляются, когда ваше приложение находится в фоновом режиме. В этом случае уведомление доставляется в системный трей устройств. При нажатии пользователем на уведомление по умолчанию открывается панель запуска приложения.
  • Сообщения с уведомлением и полезной нагрузкой данных, как фоновые, так и передние. В этом случае уведомление доставляется на
    Системный трей устройств, а данные загружаются в дополнениях о намерениях вашего лаунчера Активность.

Установите click_action в уведомлении:

Итак, если вы хотите обработать сообщения, поступившие в фоновом режиме, вы должны отправить click_action с сообщением.

click_action является параметром полезной нагрузки уведомления

Если вы хотите открыть свое приложение и выполнить определенное действие, установите click_action в полезной нагрузке уведомления и сопоставьте его с фильтром намерений в действии, которое вы хотите запустить.

Например, установите click_action на OPEN_ACTIVITY_1, чтобы активировать фильтр намерений, как показано ниже:

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

Полезная нагрузка FCM выглядит следующим образом:

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

Ответ 2

Когда приложение находится в фоновом режиме, Intent должен быть доставлен в вашей деятельности запуска. Так что это открывает вашу активность Launcher. Теперь вы проверяете, есть ли данные в Intent в активности запуска, затем запускаете требуемую активность.

Ответ 3

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>

Ваш файл FirebaseMessagingService.java метод 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());
}

Ваша облачная функция/код сервера для уведомления:

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

Ответ 4

Откройте файл MyFirebaseMessagingService.java file

внутри этого файла есть метод sendNotification(), в котором вы должны указать свою деятельность, к которой нужно перейти в Intent, как показано ниже

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

если вы отправляете несколько уведомлений и хотите переходить к различным действиям по щелчку определенного уведомления, вы можете использовать любое условное утверждение для его достижения, я предлагаю использовать переключатель, как показано ниже

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

Используя эту логику, вы можете открыть определенное действие, щелкнув Уведомление в FCM. Это прекрасно работает для меня. Спасибо