it-swarm.com.ru

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

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

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

Итак, пожалуйста, скажите мне, как указать Активность при нажатии на уведомление .. Я использую две службы: 

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;

    }
}
13
Arman Reyaz

С помощью 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"
  }
}
25
Priyank Patel

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

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>

Ваш файл FirebaseMessagingService.Java в методе MessageReceived:

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"
    }
3
Dildarkhan Pathan

Открыть 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 . Это прекрасно работает для меня . Спасибо 

1
Darshuu