Получение значений уведомлений из уведомления в системном трее android firebase FCM

Я использую firebase для отправки уведомлений в мое приложение. Я хочу сохранить уведомления, полученные на каждом устройстве, в локальной базе данных. Проблема в том, что когда приложение находится в фоновом режиме и получено уведомление, метод onMessageReceived() не будет вызываться, но вместо этого уведомление будет добавлено в системный трей в соответствии с документацией. В документации также упоминается следующее Для получения уведомления, когда приложение находится в фоновом режиме:

в этих случаях, уведомление доставляется в системный трей устройства, а полезная нагрузка данных доставляется в дополнительных целях Вашей деятельности запуска.

Итак, когда я пытаюсь получить доступ к статистам в intent, ключи уведомления не найдены. Мой код MainActivity.java:

if (getIntent().getExtras() != null) {
        for (String key : getIntent().getExtras().keySet()) {
            Object value = getIntent().getExtras().get(key);
            Toast.makeText(this, "Key: " + key + " Value: " + value, Toast.LENGTH_LONG).show();
        }
    }

уведомления мы отправляем с сервера:

{
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification" : {
  "body" : "great match!",
  "title" : "Portugal vs. Denmark",
  "icon" : "myicon"
  }
}

кто-нибудь имеет представление о том, как я могу получить значения внутри уведомлений?

5 ответов


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

на data упоминается в (акцент мой):

в этих случаях уведомление доставляется в системный трей устройства, и the сведения полезная нагрузка поставляется в дополнительных целях Вашей деятельности запуска.

- это data полезная нагрузка сообщения (см. Типы Сообщений).

вам придется отправить полезную нагрузку с обоими notification и data. Вот так:

{
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
  "notification" : {
    "body" : "great match!",
    "title" : "Portugal vs. Denmark",
    "icon" : "myicon"
    },
  "data": {
    "body" : "great match!",
    "title" : "Portugal vs. Denmark",
    "icon" : "myicon"
  }
}

см. Также мой ответ здесь.


все, что вам нужно сделать, это обновить формат уведомления толчка.

From:

{
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
  "notification" : {
    "body" : "great match!",
    "title" : "Portugal vs. Denmark",
    "icon" : "myicon"
   }
}

до

{
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
  "data" : {
    "body" : "great match!",
    "title" : "Portugal vs. Denmark",
    "icon" : "myicon"
   }
}

объяснение:

существует служба firebase, запущенная вашей системой, которая работает для всех приложений и обрабатывает все push-уведомления, если она содержит "уведомления" тег. но если содержать "сведения" тег только это просто передать задачу службе, созданной приложением, где вы можете сделать что-нибудь.В вашем случае показать уведомление пользователя и сохранить его в локальной БД. Подробнее читайте здесь Документация: Обработка Сообщений.


У меня была такая же проблема, когда backend team представила уведомления тег в полезной нагрузке fcm.

узнал, что handleIntent метод FirebaseMessagingService вызывается каждый раз, когда толчок направлен и приложение работает в фоновом режиме. И его параметр Intent имел данные часть в нем, откуда программист может выполнить намеченное действие.

надеюсь, что это помогает..


Это не простое или чистое решение, но вы можете использовать NotificationListenerService для получения обратного вызова для каждого уведомления. Еще одним ограничением является то, что он поддерживает только API 18 и выше.


добавьте это в файл манифеста

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