Вот мой манифест
<service android:name=".fcm.PshycoFirebaseMessagingServices">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service android:name=".fcm.PshycoFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
Когда приложение работает в фоновом режиме и приходит уведомление, приходит уведомление по умолчанию, и мой код не запускается onMessageReceived
.
Вот мой onMessageReceived
код Это вызывается, если мое приложение работает на переднем плане, а не когда приложение в фоновом режиме. Как запустить этот код, когда приложение тоже в фоновом режиме?
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// TODO(developer): Handle FCM messages here.
// If the application is in the foreground handle both data and notification messages here.
// 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.
data = remoteMessage.getData();
String title = remoteMessage.getNotification().getTitle();
String message = remoteMessage.getNotification().getBody();
String imageUrl = (String) data.get("image");
String action = (String) data.get("action");
Log.i(TAG, "onMessageReceived: title : "+title);
Log.i(TAG, "onMessageReceived: message : "+message);
Log.i(TAG, "onMessageReceived: imageUrl : "+imageUrl);
Log.i(TAG, "onMessageReceived: action : "+action);
if (imageUrl == null) {
sendNotification(title,message,action);
} else {
new BigPictureNotification(this,title,message,imageUrl,action);
}
}
// [END receive_message]
android
firebase
firebase-cloud-messaging
Парт Патель
источник
источник
Not getting messages here? See why this may be: goo.gl/39bRNJ
. Решение, как и приведенные ниже ответы, можно найти в документации в Сообщениях с уведомлением и полезными даннымиОтветы:
1. Почему это происходит?
В FCM (Firebase Cloud Messaging) есть два типа сообщений:
onMessageReceived()
обратный вызов только тогда, когда ваше приложение находится на переднем планеonMessageReceived()
обратный вызов, даже если ваше приложение находится на переднем плане / в фоне / убито2. Как?
Для этого вам необходимо выполнить
POST
запрос по следующему URL:Заголовки
Content-Type
, Значение:application/json
Authorization
, Значение:key=<your-server-key>
Тело с использованием тем
Или, если вы хотите отправить его на определенные устройства
3. Как обрабатывать push-уведомления?
Вот как вы обрабатываете полученное сообщение:
источник
Firebase team have not developed a UI to send data-messages to your devices, yet.
Изменилось ли это в прошлом году?onMessageReceived
не вызывается, и это серьезная проблема в FCM !!! Также, пожалуйста, обновите свой ответ.Чтобы сделать библиотеку firebase для вызова вашего onMessageReceived () в следующих случаях
Вы не должны помещать ключ JSON «извещение» в свой запрос к API Firebase, а вместо этого использовать «данные», см. ниже.
Следующее сообщение не будет вызывать ваш onMessageReceived (), когда ваше приложение находится в фоновом режиме или убито, и вы не можете настроить свое уведомление.
но вместо этого будет работать
По сути, сообщение отправляется в аргументе RemoteMessage вместе с вашим объектом данных как Map, тогда вы можете управлять уведомлением в onMessageReceived, как в фрагменте здесь.
источник
Мне кажется, что все ответы неполные, но во всех них есть что-то, что вам нужно для обработки уведомления, содержащего данные, когда ваше приложение находится в фоновом режиме.
Выполните следующие действия, и вы сможете обрабатывать уведомления, когда ваше приложение находится в фоновом режиме.
1. Добавьте фильтр намерений следующим образом:
к деятельности, которую вы хотите обработать данные уведомления.
Отправлять уведомления в следующем формате:
Ключ здесь добавить
где .MainActivity - это действие с фильтром намерений, добавленным на шаге 1.
Получить информацию «data» из уведомления в onCreate «.MainActivity»:
И это должно быть все, что вам нужно сделать. Надеюсь, это кому-нибудь поможет :)
источник
В соответствии с документацией по firebase в send downstream с использованием firebase , существует 2 типа полезной нагрузки:
данные
уведомление
Когда вы находитесь на переднем плане, вы можете получить данные внутри FCM, используя onMessageReceived () , вы можете получить свои данные из полезной нагрузки данных .
Когда вы находитесь в фоновом режиме, FCM будет отображать уведомления в системном трее на основе информации из полезных данных уведомления . Заголовок, сообщение и значок, используемые для уведомления на панели задач, извлекаются из полезной нагрузки уведомления .
Это уведомление полезной нагрузки используются , когда вы хотите automactically показывать уведомления на панели задач , когда приложение работает в фоновом режиме. Чтобы получать данные уведомлений, когда ваше приложение находится в фоновом режиме, вы должны добавить click_action внутри уведомления .
Поместите этот фильтр намерений в свой манифест, внутри одного из тегов активности. Когда вы щелкнете по уведомлению, оно откроет приложение и сразу перейдет к активности, которую вы определили в click_action, в данном случае «OPEN_ACTIVTY_1». И внутри этой деятельности вы можете получить данные:
Я использую FCM для своего приложения для Android и использую обе полезные нагрузки. Вот пример JSON, который я использую:
источник
Согласно документам
Редактировать :
Основано на этой теме :
Вы не можете установить полезную нагрузку click_action с помощью Firebase Console. Вы можете попробовать протестировать с помощью команды curl или пользовательского http-сервера.
источник
Работает с июля 2019 года
Android compileSdkVersion 28, buildToolsVersion 28.0.3 и Firebase-Messaging: 19.0.1
После многих часов исследований по всем остальным вопросам и ответам StackOverflow и пробования бесчисленных устаревших решений этому решению удалось отобразить уведомления в следующих 3 сценариях:
- Приложение находится на переднем плане:
уведомление получено методом onMessageReceived в моем классе MyFirebaseMessagingService
- Приложение было убито (оно не работает в фоновом режиме): уведомление отправляется на панель уведомлений автоматически с помощью FCM. Когда пользователь касается уведомления, приложение запускается путем вызова действия, в котором есть android.intent.category.LAUNCHER в манифесте. Вы можете получить часть данных уведомления, используя getIntent (). GetExtras () в методе onCreate ().
- Приложение в фоновом режиме: уведомление отправляется на панель уведомлений автоматически с помощью FCM. Когда пользователь касается уведомления, приложение выводится на передний план, запуская действие, в котором есть android.intent.category.LAUNCHER в манифесте. Поскольку мое приложение имеет launchMode = "singleTop" в этом действии, метод onCreate () не вызывается, потому что одно действие того же класса уже создано, вместо этого вызывается метод onNewIntent () этого класса, и вы получаете часть данных уведомление там с помощью intent.getExtras ().
Шаги: 1. Если вы определяете основную деятельность своего приложения следующим образом:
2 - добавьте эти строки в метод onCreate () вашего MainActivity.class
и эти методы к тому же MainActivity.class:
3- создайте класс MyFirebase следующим образом:
4- создайте новый класс NotificationActivity.class следующим образом:
}
5- Добавьте эти строки в манифест вашего приложения внутри тегов.
6 - добавьте эти строки в методе Application.java onCreate () или в методе MainActivity.class onCreate ():
Выполнено.
Теперь, чтобы это хорошо работало в 3 упомянутых сценариях, вы должны отправить уведомление с веб-консоли Firebase следующим образом:
В разделе «Уведомление»: заголовок уведомления = заголовок, отображаемый в диалоговом окне уведомлений (необязательно). Текст уведомления = сообщение, отображаемое пользователю (обязательно). Затем в разделе «Цель»: приложение = приложение Android и в разделе «Дополнительные параметры»: канал уведомлений Android. = default_channel_id Ключ пользовательских данных: значение заголовка: (здесь тот же текст, что и в поле «Заголовок» раздела «Уведомления») ключ: значение тела: (здесь тот же текст, что и в поле «Сообщение» раздела «Уведомления») ключ: значение click_action: .MainActivity Sound = Отключено
Истекает = 4 недели
Вы можете отладить его в эмуляторе с API 28 в Google Play.
Удачного кодирования!
источник
Так как те,
display-messages
которые отправляются из Firebase Notification UI, работают, только если ваше приложение находится на переднем плане. Потомуdata-messages
что есть необходимость сделать POST вызов FCMмеры
Установите расширение для расширенного клиента Google Chrome Extension
Добавьте следующие заголовки
Ключ : Content-Type, Значение : application / json
Ключ : Авторизация, Значение : ключ = "ключ вашего сервера"
Добавить тело
При использовании тем:
При использовании регистрационного идентификатора:
Это оно!. Теперь слушайте
onMessageReceived
обратный звонок как обычно.источник
Для захвата сообщения в фоновом режиме вам нужно использовать
BroadcastReceiver
и добавьте это в свой манифест:
источник
не вызывается каждый раз, когда вызывается только когда приложение находится в forground
есть один метод переопределения, этот метод вызывается каждый раз, независимо от того, какое приложение находится на переднем плане или в фоновом режиме или убито, но этот метод доступен с этой версией API Firebase
это версия, которую вы должны импортировать из Gradle
это метод
с предыдущим API Firebase этого метода не было, так что в этом случае сам обработчик базы огня, когда приложение находится в фоновом режиме .... теперь у вас есть этот метод, что когда-либо вы хотите ... вы можете сделать это здесь, в этом методе ... ...
если вы используете предыдущую версию, тогда действие по умолчанию начнется в этом случае вы можете получить данные таким же образом
// делай что хочешь ....}
как правило, это структура с сервера, мы получаем в уведомлении
это зависит от того, как вы хотите дать этот ключ данных или вы хотите дать уведомление обо всем, что вы можете дать ....... то, что когда-либо вы дадите здесь с тем же ключом, вы получите эти данные ........ ,
Есть несколько случаев, когда вы не отправляете действие клика в том случае, когда вы нажимаете на уведомление, откроется действие по умолчанию, но если вы хотите открыть свое конкретное действие, когда приложение находится в фоновом режиме, вы можете вызвать это действие с помощью метода handleIntent, потому что это вызывается каждый раз
источник
По документам: 17 мая 2017 г.
Итак, вы должны использовать оба уведомления полезных данных + данные:
Нет необходимости использовать click_action. Вам просто нужно получить отрывки из намерений о деятельности LAUNCHER.
Код Java должен быть в методе onCreate для MainActivity:
Вы можете протестировать оба уведомления полезной нагрузки + данные из консоли уведомлений Firebase . Не забудьте заполнить пользовательские поля данных в разделе «Дополнительные параметры»
источник
Вот более четкие понятия о сообщении Firebase. Я нашел это от их команды поддержки.
** Firebase имеет три типа сообщений **:
Уведомления : Уведомление работает на заднем или переднем плане. Когда приложение находится в фоновом режиме, уведомления уведомлений доставляются в системный трей. Если приложение находится на переднем плане, сообщения обрабатываются
onMessageReceived()
илиdidReceiveRemoteNotification
обратными вызовами. По сути, это то, что называется отображением сообщений.Сообщения данных : на платформе Android сообщение данных может работать как на заднем, так и на переднем плане. Сообщение данных будет обработано onMessageReceived (). Примечание для конкретной платформы будет следующим: На Android полезная нагрузка данных может быть получена в Intent, используемом для запуска вашей деятельности. Чтобы уточнить, если у вас есть
"click_action":"launch_Activity_1"
, вы можете получить это намерениеgetIntent()
только изActivity_1
.Сообщения с полезными нагрузками как для уведомлений, так и для данных . В фоновом режиме приложения получают полезную нагрузку для уведомлений в области уведомлений и обрабатывают полезные данные только тогда, когда пользователь нажимает на уведомление. На переднем плане ваше приложение получает объект сообщения с обоими полезными нагрузками. Во-вторых,
click_action
параметр часто используется в полезных данных уведомлений, а не в полезных данных. Если этот параметр используется внутри полезных данных, этот параметр будет обрабатываться как настраиваемая пара ключ-значение, и поэтому вам нужно будет реализовать настраиваемую логику, чтобы он работал так, как задумано.Кроме того, я рекомендую вам использовать
onMessageReceived
метод (см. Сообщение данных) для извлечения пакета данных. Исходя из вашей логики, я проверил объект пакета и не нашел ожидаемого содержимого данных. Вот ссылка на похожий случай, который может дать больше ясности.Для получения дополнительной информации посетите мою эту тему
источник
2017 обновленный ответ
Вот четкий ответ из документации по этому вопросу:
источник
Простое резюме, как это
если ваше приложение работает;
это триггеры.
если ваше приложение не запущено (убито смахиванием);
не запускается и не доставляется по адресу direclty. Если у вас есть специальная пара ключ-значение. Они не работают, потому что onMessageReceived () не работает.
Я нашел этот путь;
В своей деятельности по запуску вставьте эту логику,
в этом блоке if ищите ваши ключи в соответствии с пользовательским интерфейсом Firebase.
В этом примере мой ключ и значение как выше; (простите за язык =))
Когда мой код работает, я получаю "com.rda.note".
с этой строкой кода я закрыл свое приложение и открыл Google Play Market
счастливого кодирования =)
источник
Я выяснил сценарии,
Когда приложение находится на переднем плане , метод onMessageReceived () вызывается из FirebaseService. Так что pendingIntent , определенный в классе обслуживания будет называться.
И когда приложение находится в фоновом режиме , вызывается первое действие .
Теперь, если вы используете всплывающее действие , то следует иметь в виду, что будет вызываться splashactivity , иначе, если не будет splashActivity, то будет вызываться то, чем является первое действие.
Затем вам нужно проверить getIntent () из firstActivity , чтобы увидеть , если он имеет какой - либо сверток .if все в порядке , вы увидите расслоением там со значениями заполненными. Если значение тэга данных пересылается с сервера выглядит следующим образом ,
Затем в первом упражнении вы увидите, что есть действительное намерение ( getIntent () не равно NULL ), допустимый пакет и внутренний пакет, там будет весь JSON, упомянутый выше, с данными в качестве ключа .
Для этого сценария код для извлечения значения будет выглядеть так:
источник
Спасибо всем вам за ваши ответы. Но я решил это, отправив сообщение с данными вместо отправки уведомления . Код сервера
И поймал данные в onMessageReceived
источник
Полностью удалите полезные данные уведомлений из запроса вашего сервера. Отправляйте только данные и обрабатывайте их
onMessageReceived()
, иначе ваше приложениеonMessageReceived
не будет запущено, когда приложение находится в фоновом режиме или будет убито.Вот что я отправляю с сервера:
Таким образом, вы можете получить ваши данные
onMessageReceived(RemoteMessage message)
следующим образом: (скажем, я должен получить идентификатор)И так же вы можете получить любые данные, которые вы отправили с сервера в пределах
onMessageReceived()
.источник
Простой способ отправки сообщений, даже если приложение находится в фоновом режиме и на переднем плане, как описано ниже: - Чтобы отправить сообщение с помощью API, вы можете использовать инструмент под названием AdvancedREST Client, расширение chrome, и отправить сообщение со следующими параметрами.
Инструмент для отдыха клиентов Ссылка: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo
используйте этот URL: - https://fcm.googleapis.com/fcm/send Тип контента: application / json Авторизация: ключ = ключ вашего сервера от или ключ авторизации (см. ниже ссылка)
Ключ авторизации можно получить, посетив консоль разработчиков Google и нажав кнопку Credentials в левом меню вашего проекта. Среди перечисленных ключей API ключом авторизации будет ключ сервера.
И вам нужно поместить tokenID получателя в раздел «to» вашего POST-запроса, отправленного с помощью API.
источник
вы хотите работать с onMessageReceived (RemoteMessage remoteMessage) в фоновом режиме и отправлять только часть данных, уведомляющую эту часть:
"AnotherActivity": "True", "to": "идентификатор устройства или токен устройства"
При этом onMessageRecivied является фоном вызова и передним планом, нет необходимости обрабатывать уведомления с помощью панели уведомлений о вашей активности запуска. Обработайте данные, используя это:
источник
Июнь 2018 г. Ответ -
Вы должны убедиться, что в сообщении нет ни одного ключевого слова «уведомления». Включите только «данные», и приложение сможет обработать сообщение в onMessageReceived, даже если оно находится в фоновом режиме или уничтожено.
Использование облачных функций:
Затем в вашем onMessageReceived (), в вашем классе, расширяющем com.google.firebase.messaging.FirebaseMessagingService:
источник
Согласно OAUTH 2.0:
В этом случае будет проблема с аутентификацией, потому что теперь FCM использует OAUTH 2
Итак, я прочитал документацию FireBase и, согласно документации, новый способ публикации сообщения данных;
Заголовки
Auth
Пример тела
В URL есть идентификатор базы данных, который вы можете найти в консоли Firebase. (Идут проектные расчеты)
А теперь давайте возьмем наш токен (он будет действителен только 1 час):
Сначала в консоли Firebase откройте « Настройки»> «Учетные записи служб» . Нажмите Создать новый закрытый ключ , надежно сохраните файл JSON, содержащий ключ. Мне был нужен этот файл JSON для авторизации запросов к серверу вручную. Я скачал это.
Затем я создаю проект node.js и использую эту функцию для получения моего токена;
Теперь я могу использовать этот токен в своем почтовом запросе. Затем я публикую свое сообщение с данными, и теперь оно обрабатывается функцией приложения onMessageReceived.
источник
С 2019 года Google Firebase сильно изменил свои API, я имею в виду:
'com.google.firebase:firebase-messaging:18.0.0'
в 18.0.0 они удалены,
MyFirebaseInstanceIDService
и вам нужно получить токен,MyFirebaseMessagingService
так что вам просто нужно написать:а также в вашем AndroidManifest.xml вы должны удалить:
Также рекомендуется установить значения по умолчанию, чтобы настроить внешний вид уведомлений. Вы можете указать пользовательский значок по умолчанию и пользовательский цвет по умолчанию, которые применяются, когда эквивалентные значения не установлены в полезной нагрузке уведомления.
Добавьте эти строки внутри тега приложения, чтобы установить значок по умолчанию и цвет:
Теперь для обработки уведомительных сообщений в фоновом приложении вы должны определить Intent в своей первой Деятельности, даже если это SplashScreen. Когда ваше приложение находится в фоновом режиме, Android направляет уведомления в системный трей. При нажатии на уведомление пользователя открывается панель запуска приложения по умолчанию.
например, если ваш Json такой:
вам просто нужно написать простое намерение получить эти значения:
источник
В дополнение к ответам выше, если вы тестируете push-уведомления с помощью консоли FCM , ключ и объект «данные» не добавляются в комплект Push-уведомлений. Таким образом, вы не получите детальное push-уведомление, когда приложение находится в фоновом режиме или убито.
В этом случае вы должны выбрать консоль администратора для тестирования фонового сценария приложения.
Здесь вы добавите ключ «data» в ваш push-пакет. Таким образом, подробный толчок будет показан, как и ожидалось. Надеюсь, это поможет немногим.
источник
Используя этот код, вы можете получить уведомление в фоновом режиме / на переднем плане, а также поместить действие:
В приложении используйте этот код:
источник
Там будет два типа уведомлений
Вы должны использовать Data Notifications для обработки уведомлений, когда приложение находится в фоновом режиме.
источник
Я столкнулся с той же проблемой, перекомпилировал библиотеку firebase и запретил ей отправлять уведомления, когда приложение работает в фоновом режиме.
* библиотека https://github.com/erdalceylan/com-google-firebase-messaging
*
надежда помогает Удачи
источник