Как открыть определенную активность из push-уведомления в Android и FCM?

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

При нажатии на push-уведомление откроется основная активность. В нем я могу получить тип уведомления от намерения и открыть другое действие:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    processNotification()
}

private fun processNotification() {
    val notificationCategory = intent?.extras?.getString("category") ?: return
    if (notificationCategory == "new_message") {
        startMessagingActivity()
        finish()
    }
}

Этот способ мне кажется грязным и не удобным. Можно ли указать активность, которая будет открываться при нажатии на push-уведомление?

Обновлено: Шаги для решения:

  1. Добавьте фильтр намерений к активности, которую вы хотите открыть:

    <activity android:name = ".messages.chatroom.ChatRoomActivity">
        <intent-filter>
            <action android:name = "*your-action-name*"/>
            <category android:name = "android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>
    
  2. Добавьте поле click_action="твоё-имя-действия" в сообщение FCM.

Android автоматически откроет действие с действием, аналогичным click_action

3
0
1 856
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужно будет использовать Android Deep Linking.

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

Активность чата должна иметь хост и схему, объявленные в манифесте, ниже приведены инструкции и код для Deep Linking:

https://developer.android.com/training/app-links/глубокие ссылки

Удачного кодирования.

Спасибо, я не знал о глубинных ссылках

Mykhailo Plotnikov 30.03.2020 16:24

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

 type = remoteMessage.getData().get("type");
if (type.equals("1")) { // here you can just detremine the activity you want to open
              Intent intent;
              PendingIntent pendingIntent;
              NotificationCompat.Builder builder;
              if (notifManager == null) {
                  notifManager = (NotificationManager) getSystemService
                          (Context.NOTIFICATION_SERVICE);
              }

              intent = new Intent (this, Admin_page.class); // here chose the activity
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                  int importance = NotificationManager.IMPORTANCE_HIGH;
                  if (mChannel == null) {
                      NotificationChannel mChannel = new NotificationChannel
                              ("0", title, importance);
                      mChannel.setDescription (body);
                      mChannel.enableVibration (true);
                      mChannel.setVibrationPattern (new long[]
                              {100, 200, 300, 400, 500, 400, 300, 200, 400});
                      notifManager.createNotificationChannel (mChannel);
                  }
                  builder = new NotificationCompat.Builder (this, "0");

                  intent.setFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP |
                          Intent.FLAG_ACTIVITY_SINGLE_TOP);
                  pendingIntent = PendingIntent.getActivity (this, 0, intent, 0);
                  builder.setContentTitle (title)  // flare_icon_30
                          .setSmallIcon(R.drawable.logo_app).setTicker(title).setWhen(0)
                          .setContentText (body)  // required
                          .setDefaults (Notification.DEFAULT_ALL)
                          .setAutoCancel (true)
                          .setLargeIcon(BitmapFactory.decodeResource(this.getResources(), R.drawable.logo_app))
                          .setContentIntent (pendingIntent)
                          .setSound (RingtoneManager.getDefaultUri
                                  (RingtoneManager.TYPE_NOTIFICATION))
                          .setVibrate (new long[]{100, 200, 300, 400,
                                  500, 400, 300, 200, 400});
              } else {

                  builder = new NotificationCompat.Builder (this);

                  intent.setFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP |
                          Intent.FLAG_ACTIVITY_SINGLE_TOP);
                  pendingIntent = PendingIntent.getActivity (this, 0, intent, 0);
                  builder.setContentTitle (title)
                          .setSmallIcon(R.drawable.logo_app).setTicker(title).setWhen(0)
                          .setContentText (body)  // required
                          .setDefaults (Notification.DEFAULT_ALL)
                          .setAutoCancel (true)
                          .setLargeIcon(BitmapFactory.decodeResource(this.getResources(), R.drawable.logo_app))

                          .setContentIntent (pendingIntent)
                          .setSound (RingtoneManager.getDefaultUri
                                  (RingtoneManager.TYPE_NOTIFICATION))
                          .setVibrate (new long[]{100, 200, 300, 400, 500,
                                  400, 300, 200, 400})
                          .setPriority (Notification.PRIORITY_HIGH);
              } // else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
              Notification notification = builder.build ();
              notifManager.notify((int)date.getTime(), notification);
          }

надеюсь, что это сработает для вас

Это не я посылаю уведомление. Приложение закрыто, поэтому onMessageReceived не вызывается.

Mykhailo Plotnikov 14.06.2019 16:56

Другие вопросы по теме

Отправлять push-уведомление мобильного приложения с помощью onesignal REST API на токены устройств, хранящиеся в БД
Как добавить различные действия в зависимости от категории, определенной в полезной нагрузке входящего удаленного уведомления? Свифт ОБНОВЛЕНО
Загрузка App Store отклонена из-за проблемы с правами push
Android-бот в области уведомлений вместо значка запуска – FCM
Входящие расширенные push-уведомления не будут отображать изображение. Свифт 4
Получить количество уведомлений OneSignal
Почему JsonWebSignature с алгоритмом шифрования ECDH каждый раз дает другую подпись?
Есть ли способ отправить уведомление с одного устройства на другое устройство с помощью FCM без базы данных Firebase?
Как получить push-уведомление, когда приложение открыто?
Как настроить собственный макет для тех уведомлений, которые будут отображаться, когда приложение находится в фоновом режиме?