Я работаю с Firebase и тестирую отправку уведомлений в мое приложение с моего сервера, пока приложение находится в фоновом режиме. Уведомление отправлено успешно, оно даже появляется в центре уведомлений устройства, но когда уведомление появляется или даже если я нажимаю на него, метод onMessageReceived внутри моего FCMessagingService никогда не вызывается.
Когда я проверял это, когда мое приложение находилось на переднем плане, был вызван метод onMessageReceived, и все работало нормально. Проблема возникает, когда приложение работает в фоновом режиме.
Это предполагаемое поведение, или есть способ, которым я могу это исправить?
Вот мой FBMessagingService:
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
public class FBMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.i("PVL", "MESSAGE RECEIVED!!");
if (remoteMessage.getNotification().getBody() != null) {
Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getNotification().getBody());
} else {
Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getData().get("message"));
}
}
}
android
firebase
firebase-cloud-messaging
Cyogenos
источник
источник
Ответы:
Это работает по назначению, уведомления отправляются на ваш обратный вызов onMessageReceived только тогда, когда ваше приложение находится на переднем плане. Если ваше приложение находится в фоновом режиме или закрыто, то в центре уведомлений отображается сообщение с уведомлением, и любые данные из этого сообщения передаются в намерение , которое запускается в результате нажатия пользователем уведомления.
Вы можете указать click_action, чтобы указать намерение, которое должно быть запущено, когда уведомление касается пользователя. Основная активность используется, если не указано click_action.
Когда намерение запущено, вы можете использовать
чтобы получить набор, который будет включать любые данные, отправленные вместе с уведомлением.
Для получения дополнительной информации об уведомлении см. Документацию .
источник
click_action
когда я использую Консоль уведомлений Firebase?Полностью удалите
notification
поле из запроса вашего сервера. Толькоdata
отправлять и обрабатывать,onMessageReceived()
иначе ваше приложениеonMessageReceived()
не будет запущено, когда приложение находится в фоновом режиме или убито.Не забудьте включить
"priority": "high"
поле в запрос на уведомление. Согласно документации: сообщения данных отправляются с обычным приоритетом, поэтому они не будут поступать мгновенно; это также может быть проблемой.Вот что я отправляю с сервера
Таким образом, вы можете получить свои данные,
onMessageReceived(RemoteMessage message)
как это .... скажем, я должен получить идентификатористочник
этот метод handleIntent () устарел, поэтому обработку уведомления можно выполнить, как показано ниже:
Состояние переднего плана: щелчок уведомления перейдет к ожидающему выполнению намерения, которое вы предоставляете при создании уведомления программно, как это обычно делается с полезной нагрузкой данных уведомления.
Фоновое / убитое состояние - здесь сама система создает уведомление на основе полезной нагрузки уведомлений, и щелкнув по этому уведомлению, вы перейдете к активности запуска приложения, где вы можете легко получить данные о намерениях любым из ваших методов жизненного цикла.
источник
OnMessageReceived
в этом случае!Вот более четкие понятия о сообщении Firebase. Я нашел это от их команды поддержки.
Firebase имеет три типа сообщений :
Уведомления : Уведомление работает на заднем или переднем плане. Когда приложение находится в фоновом режиме, уведомления уведомлений доставляются в системный трей. Если приложение находится на переднем плане, сообщения обрабатываются
onMessageReceived()
илиdidReceiveRemoteNotification
обратными вызовами. По сути, это то, что называется отображением сообщений.Сообщения данных : на платформе Android сообщение данных может работать на заднем и переднем плане. Сообщение данных будет обработано onMessageReceived (). Примечание для конкретной платформы будет следующим: На Android полезная нагрузка данных может быть получена в Intent, используемом для запуска вашей активности. Чтобы уточнить, если у вас есть
"click_action":"launch_Activity_1"
, вы можете получить это намерениеgetIntent()
только изActivity_1
.Сообщения с полезными нагрузками как для уведомлений, так и для данных . В фоновом режиме приложения получают полезную нагрузку для уведомлений в области уведомлений и обрабатывают полезные данные только тогда, когда пользователь нажимает на уведомление. На переднем плане ваше приложение получает объект сообщения с обоими полезными нагрузками. Во-вторых, параметр click_action часто используется в полезных данных уведомлений, а не в полезных данных. Если этот параметр используется внутри полезных данных, этот параметр будет обрабатываться как пользовательская пара ключ-значение, и поэтому вам нужно будет реализовать собственную логику, чтобы он работал как задумано.
Также я рекомендую вам использовать метод onMessageReceived (см. Сообщение данных) для извлечения пакета данных. Исходя из вашей логики, я проверил объект пакета и не нашел ожидаемого содержимого данных. Вот ссылка на похожий случай, который может дать больше ясности.
Со стороны сервера уведомление Firebase должно иметь следующий формат :
Серверная сторона должна отправить объект «уведомление» . Недостаток объекта «уведомления» в моем
TargetActivity
не получающем сообщение используяgetIntent()
.Правильный формат сообщения указан ниже:
Вот более четкие понятия о сообщении Firebase. Я нашел это от их команды поддержки.
Для получения дополнительной информации посетите мою эту тему и эту тему
источник
У меня такая же проблема. Проще использовать «сообщение с данными» вместо «уведомления». Сообщение данных всегда загружает класс onMessageReceived.
В этом классе вы можете сделать свое собственное уведомление с помощью мастера уведомлений.
Пример:
источник
В соответствии с документацией Firebase Cloud Messaging - если Activity находится на переднем плане, то вызывается onMessageReceived. Если действие находится в фоновом режиме или закрыто, то в центре уведомлений отображается уведомление об активности запуска приложения. Вы можете вызвать свою индивидуальную активность по щелчку уведомления, если ваше приложение находится в фоновом режиме, вызвав API службы отдыха для передачи сообщений в Firebase как:
URL- https://fcm.googleapis.com/fcm/send
Тип метода - POST
Тело / Payload:
И с этим в вашем приложении вы можете добавить ниже код в вашей деятельности, который будет называться:
источник
onMessageReceived
?Метод onMessageReceived (RemoteMessage remoteMessage) вызывается в следующих случаях.
onMessageReceived (RemoteMessage remoteMessage) вызвал, показывает LargeIcon и BigPicture в панели уведомлений. Мы можем прочитать содержимое как из уведомления, так и из блока данных.
onMessageReceived (RemoteMessage remoteMessage) не вызывается , системный трей получит сообщение и прочитает текст и заголовок из блока уведомлений и покажет сообщение и заголовок по умолчанию в панели уведомлений.
В этом случае удаление блоков уведомлений из json
Решение для вызова onMessageReceived ()
onMessageReceived (RemoteMessage remoteMessage) вызвал, показывает LargeIcon и BigPicture в панели уведомлений. Мы можем прочитать содержимое как из уведомления, так и из блока данных.
При вызове onMessageReceived (RemoteMessage remoteMessage) системный трей не получит сообщение, поскольку ключ уведомления отсутствует в ответе. Показывает LargeIcon и BigPicture в панели уведомлений
Код
Ссылка Ссылка:
https://firebase.google.com/docs/cloud-messaging/android/receive
источник
У меня та же проблема. Если приложение на переднем плане - оно запускает мою фоновую службу, где я могу обновить свою базу данных в зависимости от типа уведомления. Но приложение переходит в фоновый режим - служба уведомлений по умолчанию будет заботиться о том, чтобы показывать уведомление пользователю.
Вот мое решение для идентификации приложения в фоновом режиме и запуска вашего фонового сервиса,
В manifest.xml
Протестировал это решение в последней версии Android 8.0. Спасибо
источник
WakefulBroadcastReceiver
устарело начиная с уровня API 26.1.0.Если приложение находится в фоновом режиме или неактивно (убито), и вы нажимаете на Уведомление , вы должны проверить полезную нагрузку в LaunchScreen (в моем случае экран запуска - MainActivity.java).
Таким образом , в MainActivity.java на OnCreate чек на Extras :
источник
Переопределите
handleIntent
методFirebaseMessageService
работ для меня.здесь код в C # (Xamarin)
и вот код в Java
источник
По умолчанию Launcher Activity в вашем приложении запускается, когда ваше приложение находится в фоновом режиме, и вы щелкаете уведомление, если у вас есть какая-либо часть данных с вашим уведомлением, вы можете обрабатывать ее в том же действии, как показано ниже,
источник
Если приложение находится в фоновом режиме. Fire-base по умолчанию обрабатывает уведомление. Но если мы хотим получить наше пользовательское уведомление, то нам нужно изменить нашу серверную часть, которая отвечает за отправку наших пользовательских данных (полезная нагрузка данных).
Полностью удалите полезные данные уведомлений из запроса к вашему серверу. Отправляйте только данные и обрабатывайте их в onMessageReceived (), иначе ваш onMessageReceived не будет запущен, когда приложение находится в фоновом режиме или убито.
Теперь ваш формат кода на стороне сервера выглядит так:
ПРИМЕЧАНИЕ : см. Эту строку в приведенном выше коде
«text»: «Джон Доу поделился контактом в группе Contact Exchange» в разделе «Полезные данные», вы должны использовать параметр «text» вместо «body» или «message» для описания сообщения или чего-либо еще хочу использовать текст.
onMessageReceived ()
источник
Просто вызовите это в методе onCreate вашей MainActivity:
источник
в соответствии с решением от Ex3 t3h я хотел бы опубликовать чистый код здесь. Просто поместите его в MyFirebaseMessagingService и все работает нормально, если приложение находится в фоновом режиме. Вам нужно хотя бы скомпилировать com.google.firebase: firebase-messaging: 10.2.1
источник
Попробуй это:
источник
У меня была эта проблема (приложение не хочет открываться при нажатии на уведомление, если приложение находится в фоновом режиме или закрыто), и проблема была недействительной
click_action
в теле уведомления, попробуйте удалить или изменить его на что-то действительное.источник
Точка, которая заслуживает выделения, состоит в том, что вы должны использовать сообщение данных - только ключ данных - чтобы вызывать обработчик onMessageReceived, даже когда приложение находится в фоновом режиме. У вас не должно быть никаких других ключей уведомлений в вашей полезной нагрузке, иначе обработчик не будет запущен, если приложение находится в фоновом режиме.
Это упоминается (но не особо подчеркивается в документации FCM) здесь:
https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages
источник
Бэкэнд, с которым я работаю, использует сообщения уведомлений, а не сообщения данных. Поэтому после прочтения всех ответов я попытался извлечь дополнительные сведения из набора намерений, которые приходят к запущенному действию. Но независимо от того, какие ключи я пытался получить
getIntent().getExtras();
, значение всегда было нулевым.Тем не менее, я наконец нашел способ отправлять данные с помощью уведомлений и извлекать их из намерения.
Ключевым моментом здесь является добавление полезных данных в сообщение уведомления.
Пример:
После этого вы сможете получить информацию следующим образом:
intent.getExtras().getString("title")
будетmessage_title
и
intent.getExtras().getString("message")
будетmessage_body
Ссылка
источник
Если ваша проблема связана с отображением большого изображения, т.е. если вы отправляете push-уведомление с изображением из консоли Firebase, и оно отображает изображение, только если приложение находится на переднем плане. Решением этой проблемы является отправка push-сообщения только с полем данных. Что-то вроде этого:
источник
Когда сообщение получено, а ваше приложение находится в фоновом режиме, уведомление отправляется в дополнение к основной деятельности.
Вы можете проверить дополнительные значения в функциях oncreate () или onresume () основного действия.
Вы можете проверить поля, такие как данные, таблица и т. Д. (Поле, указанное в уведомлении)
например, я отправил, используя данные в качестве ключа
источник
У меня возникла та же проблема, и я еще немного покопался в этом. Когда приложение находится в заднем плане, уведомительное сообщение отправляется в системный трей, а сообщение данных отправляется
onMessageReceived()
См https://firebase.google.com/docs/cloud-messaging/downstream#monitor-token-generation_3
и https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MyFirebaseMessagingService.java
Для того, чтобы убедиться , что сообщение , которое вы отправляете, говорят документы, « С помощью сервера приложений и сервера API ТСМ:.. Установить ключ данных только может быть либо сборно - разборным или нескладным »
См https://firebase.google.com/ Docs / облако сообщения / концепция-опция # notifications_and_data_messages
источник
Существует два типа сообщений: уведомления и сообщения с данными. Если вы отправляете только сообщение с данными, то в строке сообщения отсутствует объект уведомления. Это будет вызвано, когда ваше приложение в фоновом режиме.
источник
Проверьте ответ @Mahesh Kavathiya. Для моего случая в коде сервера есть только так:
Вам нужно изменить на:
Затем, в случае, если приложение в фоновом режиме, дополнительное задание по умолчанию будет получать «данные»
Удачи!
источник
Просто переопределите метод OnCreate в FirebaseMessagingService. Он вызывается, когда ваше приложение находится в фоновом режиме:
источник
Есть 2 вида из Firebase кнопочных уведомлений:
1- Уведомление (Показать сообщение) -> - 1.1 Если вы выберете этот вариант, ОС создаст само уведомление, если приложение находится в фоновом режиме, и передаст данные в
intent
. Тогда клиент должен обработать эти данные.- 1,2 Если приложение находится в переднем плане , то уведомление будет получено через
callback-function
в ,FirebaseMessagingService
и это до клиента , чтобы справиться с этим.2- Сообщения данных (до 4 тыс. Данных) -> Эти сообщения используются для отправки только данных клиенту (без вывода сообщений), и клиент может обработать их в обоих случаях: фон / передний план через функцию обратного вызова в
FirebaseMessagingService
Это в соответствии с официальными документами: https://firebase.google.com/docs/cloud-messaging/concept-options
источник