Google FCM getIntent не возвращает ожидаемые данные, когда приложение находится в фоновом состоянии

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

На основе понятий: в FCM есть два типа сообщений:

display-messages. Эти сообщения работают только тогда, когда ваше приложение находится на переднем плане.

сообщения данных. Эти сообщения работают, даже если ваше приложение находится в фоновом режиме. Когда наше приложение находится в фоновом режиме, Android направляет уведомления на системный лоток.

для обработки данных-сообщений ваше уведомление должно иметь поле click_action = "YOUR_ACTION" .

Мое сообщение понравится:

{
 "data": {
  "body": "here is body",
  "title": "Title",
  "click_action": "YOUR_ACTION"
 },
 "to": "ffEseX6vwcM:APA91bF8m7wOF MY FCM ID 07j1aPUb"
}

В Activity появится сообщение, в котором будет показан файл манифеста:

<activity
            android:name=".NotificationActivity"
            android:screenOrientation="portrait"
            android:theme="@style/Theme.AppCompat.Dialog"
            android:windowSoftInputMode="stateHidden" >

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

После нажатия кнопки "Уведомление" он перенаправляется на мой NotificationActivity. В моем методе NotificationActivity in onCreate и onNewIntent я извлекаю сообщение, используя этот способ:

Bundle bundle=getIntent().getExtras();
        if(bundle!=null) {
            for (String key : bundle.keySet()) {
                Object value = bundle.get(key);
                Log.d("DATA_SENT", String.format("%s %s (%s)", key,
                        value.toString(), value.getClass().getName()));
            }
        }

К сожалению, в моем NotificationActivity я получаю сообщение ниже:

google.sent_time: 1471631793774

от: 50711789666

google.message_id 0: 1471631793776823% 098e508d098e508d

collapse_key: com.myapp.package_name

Но где мои ожидаемые данные уведомления?

Вот моя конфигурация системы:

Версия для Android версии: 2.1.3

Версия Firebase: com.google.firebase: firebase-auth: 9.0.1

версия службы Google Play: com.google.android.gms: play-services: 9.2.1

Вот некоторые ссылки:

Спасибо заранее. Извините за плохой английский.

Ответ 1

Правильное решение для верхней части андроида. Фактически, сообщение с уведомлением было проблемой. Он отправляет мне объект "данных", но не "объект уведомления". Недостаток объекта "уведомление" в моем TargetActivity не получал сообщение с помощью getIntent(). После отправки объекта "уведомление" он решил мою проблему.

Правильный формат сообщения приведен ниже:

{
 "data": {
  "body": "here is body",
  "title": "Title"
 },
"notification": {
  "body": "here is body",
  "title": "Title",
  "click_action": "YOUR_ACTION"
 },
 "to": "ffEseX6vwcM:APA91bF8m7wOF MY FCM ID 07j1aPUb"
}

Вот более понятные понятия о сообщении firebase. Я нашел его в своей команде поддержки. Firebase имеет три типа сообщений:

Сообщения оповещения. Сообщение уведомления работает на фоне или переднем плане. Когда приложение находится в фоновом режиме, сообщения уведомления доставляются на системный трей. Если приложение находится на переднем плане, сообщения обрабатываются обратными вызовами onMessageReceived() или didReceiveRemoteNotification. Это, по сути, то, что называется сообщениями "Отображать".

Сообщения данных. На платформе Android сообщение данных может работать на фоне и переднем плане. Сообщение данных будет обработано onMessageReceived(). Здесь особое внимание будет уделено платформе: на Android полезная нагрузка данных может быть восстановлена ​​в намерении, используемом для запуска вашей активности. Чтобы разработать, если у вас есть "click_action": "launch_Activity_1", вы можете получить это намерение через getIntent() только из Activity_1.

Сообщения с полезными нагрузками уведомлений и данных: Когда в фоновом режиме приложения получают полезную нагрузку уведомления в лотке уведомлений и обрабатывают только полезную нагрузку данных, когда пользователь нажимает на уведомление. Когда на переднем плане ваше приложение получает объект сообщения с доступными полезными нагрузками. Во-вторых, параметр click_action часто используется в полезной нагрузке уведомления, а не в полезной нагрузке данных. Если он используется внутри полезной нагрузки данных, этот параметр будет рассматриваться как настраиваемая пара ключ-значение, и поэтому вам потребуется реализовать пользовательскую логику, чтобы она работала по назначению.

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