Как обрабатывать уведомление, когда приложение находится в фоновом режиме в Firebase
Вот мой манифест
Когда приложение находится в фоновом режиме и появляется уведомление, появляется уведомление по умолчанию и не запускается мой код onMessageReceived
.
Вот мой код onMessageReceived
. Это вызывает, если мое приложение работает на переднем плане, а не приложением в фоновом режиме. Как запустить этот код, когда приложение также находится в фоновом режиме?
- Как запустить onListItemClick в Listactivity с помощью кнопок в списке?
- Могу ли я использовать assert на устройствах Android?
- Камера Android не работает. startPreview не работает
- Android / Java: как отложить возврат в методе
- Студия Android: новый проект и новый модуль
// [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]
- Как использовать SDK Google Диска в Android-проекте с жестко запрограммированными учетными данными
- Как передать ArrayList <HashMap > из одной активности в другую
- ConnectivityManager.CONNECTIVITY_ACTION устарел
- Android map v2 zoom, чтобы показать все маркеры
- Узнайте, прокручивается ли ListView до конца?
- Android - Установить идентификатор fragmentа
- зум
- Изменить язык ввода клавиатуры
1. Почему это происходит?
В FCM (Firebase Cloud Messaging) есть два типа сообщений:
- Отображаемые сообщения . Эти сообщения активируют
onMessageReceived()
вызовonMessageReceived()
только тогда, когда ваше приложение находится на переднем плане - Сообщения данных. Сообщения тезисов вызывают
onMessageReceived()
вызовonMessageReceived()
даже если ваше приложение находится на переднем плане / фоне / убито
Команда Firebase пока не разработала пользовательский интерфейс для отправки data-messages
на свои устройства.
2. Как?
Для этого вам необходимо выполнить запрос POST
по следующему URL-адресу:
Заголовки
- Ключ:
Content-Type
, Value:application/json
- Ключ:
Authorization
, Значение:key=
Тело, использующее темы
{ "to": "/topics/my_topic", "data": { "my_custom_key": "my_custom_value", "my_custom_key2": true } }
Или если вы хотите отправить его на определенные устройства
{ "data": { "my_custom_key": "my_custom_value", "my_custom_key2": true }, "registration_ids": ["{device-token}","{device2-token}","{device3-token}"] }
ПРИМЕЧАНИЕ. Убедитесь, что вы не добавляете ключевое
notification
JSON.
ПРИМЕЧАНИЕ. Чтобы получить ключ сервера, вы можете найти его в консоли firebase:Your project -> settings -> Project settings -> Cloud messaging -> Server Key
3. Как обрабатывать push-уведомление?
Вот как вы обрабатываете полученное сообщение:
@Override public void onMessageReceived(RemoteMessage remoteMessage) { Map data = remoteMessage.getData(); String myCustomKey = data.get("my_custom_key"); // Manage data }
Чтобы библиотека firebase вызывала ваш onMessageReceived () в следующих случаях
- Приложение на переднем плане
- Приложение в фоновом режиме
- Приложение было убито
вы не должны ставить JSON-сообщение «уведомление» в свой запрос на firebase API, но вместо этого используйте «данные», см. ниже.
Следующее сообщение не будет вызывать ваш onMessageReceived (), когда ваше приложение находится в фоновом режиме или убито, и вы не можете настроить свое уведомление.
{ "to": "/topics/journal", "notification": { "title" : "title", "text": "data!", "icon": "ic_notification" } }
но вместо этого это будет работать
{ "to": "/topics/dev_journal", "data": { "text":"text", "title":"", "line1":"Journal", "line2":"刊物" } }
В основном сообщение отправляется в аргументе RemoteMessage вместе с вашим объектом данных в виде Карты, тогда вы можете управлять уведомлением в onMessageReceived, как в fragmentе здесь
@Override public void onMessageReceived(RemoteMessage remoteMessage) { Map data = remoteMessage.getData(); //you can get your text message here. String text= data.get("text"); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) // optional, this is to make beautiful icon .setLargeIcon(BitmapFactory.decodeResource( getResources(), R.mipmap.ic_launcher)) .setSmallIcon(smallIcon) //mandatory ....... /*You can read more on notification here: https://developer.android.com/training/notify-user/build-notification.html https://www.youtube.com/watch?v=-iog_fmm6mE */ }
Я чувствую, что все ответы являются неполными, но у всех есть что-то, что вам нужно для обработки уведомления, которое имеет данные, когда ваше приложение находится в фоновом режиме.
Выполните следующие действия, и вы сможете обрабатывать свои уведомления, когда ваше приложение находится в фоновом режиме.
1. Добавьте фильтр-замысел следующим образом:
к активности, которую вы хотите обработать данные уведомления.
-
Отправлять уведомления в следующем формате:
{ "notification" : { "click_action" : ".MainActivity", "body" : "new Symulti update !", "title" : "new Symulti update !", "icon" : "ic_notif_symulti" }, "data": { ... }, "to" : "c9Vaa3ReGdk:APA91bH-AuXgg3lDN2WMcBrNhJZoFtYF9" }
Ключевым моментом здесь является добавление
"click_action" : ".MainActivity"
где .MainActivity – это активность с фильтром намерений, который вы добавили на шаге 1.
-
Получите информацию «данные» из уведомления в onCreate из «.MainActivity»:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //get notification data info Bundle bundle = getIntent().getExtras(); if (bundle != null) { //bundle must contain all info sent in "data" field of the notification } }
И это должно быть все, что вам нужно. Надеюсь, это поможет кому-то 🙂
Согласно документам
Обрабатывать сообщения в фоновом режиме
Когда ваше приложение находится в фоновом режиме, Android направляет уведомления на системный трей. Пользователь, нажав на уведомление, открывает по умолчанию программу запуска приложений.
Сюда входят сообщения, которые содержат как полезную нагрузку уведомления, так и данные. В этих случаях уведомление доставляется на системный лоток устройства, а полезная нагрузка данных доставляется в дополнение к назначению вашей активности запуска.
Если вы хотите открыть приложение и выполнить определенное действие, установите click_action в полезной нагрузке уведомления и сопоставьте его с фильтром намерения в Activity, который вы хотите запустить. Например, установите click_action в OPEN_ACTIVITY_1, чтобы запустить фильтр намерений следующим образом:
Редактировать :
Основываясь на этой теме :
Вы не можете установить полезную нагрузку click_action с помощью Firebase Console. Вы можете попробовать тестирование с помощью команды curl или настраиваемого HTTP-сервера
curl --header "Authorization: key=" --header Content-Type:"application/json" https://fcm.googleapis.com/fcm/send -d "{\"to\":\"/topics/news\",\"notification\": {\"title\": \"Click Action Message\",\"text\": \"Sample message\", \"click_action\":\"OPEN_ACTIVITY_1\"}}"
В соответствии с документацией по пожарной базе при отправке вниз по течению с использованием firebase существует 2 типа полезной нагрузки:
-
данные
Этот параметр указывает настраиваемые пары ключ-значение полезной нагрузки сообщения. Клиентское приложение отвечает за обработку сообщений данных. В сообщениях данных есть только настраиваемые пары ключ-значение.
-
уведомление
Этот параметр указывает предопределенные, видимые пользователем пары ключ-значение полезной нагрузки уведомления. FCM автоматически отображает сообщение на конечные устройства от имени клиентского приложения. Сообщения уведомлений имеют предопределенный набор видимых пользователем клавиш.
Когда вы находитесь на переднем плане, вы можете получить данные внутри FCM, используя onMessageReceived () , вы можете получить данные из данных полезной нагрузки.
data = remoteMessage.getData(); String customData = (String) data.get("customData");
Когда вы находитесь в фоновом режиме, FCM будет показывать уведомление в системном трее на основе информации из полезной нагрузки уведомления . Заголовок, сообщение и значок, который используется для уведомления в системном трее, получают из полезной нагрузки уведомления .
{ "notification": { "title" : "title", "body" : "body text", "icon" : "ic_notification" } }
Эта полезная нагрузка уведомлений используется, когда вы хотите автоматически показывать уведомление на панели задач, когда ваше приложение находится в фоновом режиме. Чтобы получать данные уведомления, когда ваше приложение находится в фоновом режиме, вы должны добавить click_action внутри полезной нагрузки уведомления .
Если вы хотите открыть свое приложение и выполнить определенное действие [в фоновом режиме], установите click_action в полезной нагрузке уведомления и сопоставьте его с фильтром намерений в Запуске, который вы хотите запустить. Например, установите click_action в OPEN_ACTIVITY_1, чтобы запустить фильтр намерений следующим образом:
Поместите этот фильтр намерений на ваш манифест, внутри тега приложения. Когда вы нажмете уведомление, он откроет приложение и перейдет к действию, которое вы определяете в click_action, в данном случае «OPEN_ACTIVTY_1». И внутри этой деятельности вы можете получить данные:
Bundle b = getIntent().getExtras(); String someData = b.getString("someData");
Я использую FCM для своего приложения для Android и использую обе полезной нагрузки. Вот пример JSON, который я использую:
{ "to": "FCM registration ID", "notification": { "title" : "title", "body" : "body text", "icon" : "ic_notification" }, "data": { "someData" : "This is some data", "someData2" : "etc" } }
Поскольку display-messages
которые отправляются из Firebase Notification UI, работают только в том случае, если ваше приложение находится на переднем плане. Для data-messages
необходимо сделать запрос POST для FCM
меры
-
Установка дополнительного клиента для клиентов Google Chrome Extension
-
Добавьте следующие заголовки
Ключ : Content-Type, Value : application / json
Ключ : Авторизация, Значение : ключ = “ваш ключ сервера”
-
Добавить тело
-
Если вы используете темы:
{ "to" : "/topics/topic_name", "data": { "key1" : "value1", "key2" : "value2", } }
-
Если используется идентификатор регистрации:
{ "registration_ids" : "[{"id"},{id1}]", "data": { "key1" : "value1", "key2" : "value2", } }
-
Это оно!. Теперь послушайте onMessageReceived
вызов onMessageReceived
как обычно.
@Override public void onMessageReceived(RemoteMessage remoteMessage) { Map data = remoteMessage.getData(); String value1 = data.get("key1"); String value2 = data.get("key2"); }
@Override public void onMessageReceived(RemoteMessage remoteMessage) { }
не вызывается каждый раз, когда он вызывается только тогда, когда приложение находится в подполье
существует один метод переопределения, этот метод вызывается каждый раз, независимо от того, какое приложение находится на переднем плане или в фоновом режиме или убито, но этот метод доступен с этой версией firebase api
это версия, которую вы должны импортировать из gradle
compile 'com.google.firebase:firebase-messaging:10.2.1'
это метод
@Override public void handleIntent(Intent intent) { super.handleIntent(intent); // you can get ur data here //intent.getExtras().get("your_data_key") }
с предыдущей firebase api этого метода не было, поэтому в этом случае fire base обрабатывает себя, когда приложение находится в фоновом режиме …. теперь у вас есть этот метод, что бы вы хотели сделать … u можете сделать это здесь, в этом методе. …
если вы используете предыдущую версию, чем начнется действие по умолчанию, в этом случае вы можете получать данные одинаково
if(getIntent().getExtras() != null && getIntent().getExtras().get("your_data_key") != null) { String strNotificaiton = getIntent().getExtras().get("your_data_key").toString();
// делай то, что захочешь ….}
обычно это структура с сервера, который мы получаем в уведомлении
{ "notification": { "body": "Cool offers. Get them before expiring!", "title": "Flat 80% discount", "icon": "appicon", "click_action": "activity name" //optional if required..... }, "data": { "product_id": 11, "product_details": "details.....", "other_info": "......." } }
это зависит от того, как вы хотите дать этот ключ данных или хотите получить уведомление, что-нибудь, что вы можете дать ……., что когда-либо вы дадите здесь с тем же ключом, и получите эти данные …….. ,
есть несколько случаев, если ур не отправляет действие click в этом случае, когда u нажмет на действие по умолчанию уведомления, откроется, но если вы хотите открыть свою конкретную деятельность, когда приложение находится в фоновом режиме, вы можете вызывать свою активность из этого метода handleIntent, потому что это вызывается каждый раз
Чтобы захватить сообщение в фоновом режиме, вам необходимо использовать BroadcastReceiver
public class FirebaseDataReceiver extends WakefulBroadcastReceiver { private final String TAG = "FirebaseDataReceiver"; public void onReceive(Context context, Intent intent) { Log.d(TAG, "I'm in!!!"); Bundle dataBundle = intent.getBundleExtra("data"); Log.d(TAG, dataBundle.toString()); } }
и добавьте это в свой манифест:
Вот более понятные понятия о сообщении о битве. Я нашел его в своей команде поддержки.
Firebase имеет три типа сообщений :
Сообщения оповещения : сообщение уведомления работает на фоне или переднем плане. Когда приложение находится в фоновом режиме, сообщения уведомления доставляются на системный трей. Если приложение находится на переднем плане, сообщения обрабатываются onMessageReceived()
или didReceiveRemoteNotification
. Это, по сути, то, что называется сообщениями «Отображать».
Сообщения данных . На платформе Android сообщение данных может работать на фоне и переднем плане. Сообщение данных будет обработано onMessageReceived (). Здесь особое внимание будет уделено платформе: на Android полезная нагрузка данных может быть восстановлена в намерении, используемом для запуска вашей активности. Чтобы разработать, если у вас есть "click_action":"launch_Activity_1"
, вы можете получить это намерение через getIntent()
только из Activity_1
.
Сообщения с полезными нагрузками уведомлений и данных : когда в фоновом режиме приложения получают полезную нагрузку уведомления в лотке уведомлений и обрабатывают только полезную нагрузку данных, когда пользователь нажимает на уведомление. Когда на переднем плане ваше приложение получает объект сообщения с доступными полезными нагрузками. Во-вторых, параметр click_action
часто используется в полезной нагрузке уведомления, а не в полезной нагрузке данных. Если он используется внутри полезной нагрузки данных, этот параметр будет рассматриваться как настраиваемая пара ключ-значение, и поэтому вам потребуется реализовать пользовательскую логику, чтобы она работала по назначению.
Кроме того, я рекомендую использовать метод onMessageReceived
(см. Сообщение данных) для извлечения onMessageReceived
данных. Из вашей логики я проверил объект пакета и не нашел ожидаемого содержимого данных. Вот ссылка на аналогичный случай, который может обеспечить большую ясность.
Для получения дополнительной информации посетите эту тему
2017 обновленный ответ
Вот четкий ответ из документации по этому поводу:
Я понял сценарии,
Когда приложение находится на переднем плане , вызывается метод onMessageReceived () из FirebaseService. Таким образом будет вызван параметр pendingIntent, определенный в classе службы.
И когда приложение находится в фоновом режиме , вызывается первая активность .
Теперь, если вы используете активность всплеска , тогда нужно иметь в виду, что будет вызвана функция splashactivity , иначе, если нет splashActivity, тогда будет вызываться любое первое действие.
Затем вам нужно проверить getIntent () для firstActivity, чтобы узнать, есть ли у него какой-либо комплект. Если все в порядке, вы увидите, что пакет имеет значения, заполненные. Если значение в теге данных, отправленное с сервера, выглядит следующим образом:
"data": { "user_name": "arefin sajib", "value": "user name notification" }
Затем в первом действии вы увидите, что существует действительное намерение ( getIntent () не является нулевым ), действительный пакет и внутренний пакет, здесь будет указан весь JSON с данными как ключом .
Для этого сценария код для извлечения значения будет выглядеть следующим образом:
if(getIntent()!=null){ Bundle bundle = getIntent().getExtras(); if (bundle != null) { try { JSONObject object = new JSONObject(bundle.getStringExtra("data")); String user_name = object.optString("user_name"); } catch (JSONException e) { e.printStackTrace(); } } }
Согласно документам: 17 мая 2017 года
Когда ваше приложение находится в фоновом режиме , Android направляет уведомления на системный трей. Пользователь, нажав на уведомление, открывает по умолчанию программу запуска приложений .
Сюда входят сообщения, содержащие как полезную нагрузку для уведомлений, так и данные (и все сообщения, отправленные с консоли уведомлений). В этих случаях уведомление доставляется на системный лоток устройства, а полезная нагрузка данных доставляется в дополнение к назначению вашей активности запуска.
Таким образом, вы должны использовать оба уведомления + данных полезной нагрузки:
{ "to": "FCM registration ID", "notification": { "title" : "title", "body" : "body text", "icon" : "ic_notification" }, "data": { "someData" : "This is some data", "someData2" : "etc" } }
Нет необходимости использовать click_action.You нужно просто получить exras от намерения по активности LAUNCHER
Java-код должен быть включен в метод onCreate для MainActivity:
Intent intent = getIntent(); if (intent != null && intent.getExtras() != null) { Bundle extras = intent.getExtras(); String someData= extras.getString("someData"); String someData2 = extras.getString("someData2"); }
Вы можете протестировать оба уведомления о полезной нагрузке + данные из консоли уведомлений Firebase . Не забудьте заполнить поля пользовательских данных в разделе «Дополнительные параметры»
Простое резюме, подобное этому
-
если ваше приложение запущено;
onMessageReceived()
это триггеры.
-
если ваше приложение не работает (убито путем прокрутки);
onMessageReceived()
не запускается и не отправляется напрямую. Если у вас есть специальная пара ключ-значение. Они не работают, поскольку onMessageReceived () не работает.
Я нашел это;
В вашей работе с пусковой установкой ставьте эту логику,
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState, R.layout.activity_splash); if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("PACKAGE_NAME")) { // do what you want // and this for killing app if we dont want to start android.os.Process.killProcess(android.os.Process.myPid()); } else { //continue to app } }
в этом блоке if найдите свои ключи в соответствии с пользовательским интерфейсом Firebase.
В этом примере мой ключ и значение, как указано выше; (извините за язык =))
Когда мой код работает, я получаю «com.rda.note».
android.os.Process.killProcess(android.os.Process.myPid());
с этой строкой кода я закрыл приложение и открыл Google Play Market
счастливое кодирование =)
Удалите всю полезную нагрузку уведомления из запроса на сервер. Отправляйте только данные и обрабатывайте их в onMessageReceived()
, иначе ваш onMessageReceived
не будет запущен, когда приложение окажется в фоновом режиме или убито.
Вот что я посылаю с сервера:
{ "data":{ "id": 1, "missedRequests": 5 "addAnyDataHere": 123 }, "to": "fhiT7evmZk8:APA91bFJq7Tkly4BtLRXdYvqHno2vHCRkzpJT8QZy0TlIGs......" }
Таким образом, вы можете получать свои данные в onMessageReceived(RemoteMessage message)
следующим образом: (скажем, мне нужно получить идентификатор)
Object obj = message.getData().get("id"); if (obj != null) { int id = Integer.valueOf(obj.toString()); }
И аналогичным образом вы можете получить любые данные, которые вы отправили с сервера в onMessageReceived()
.
Легкий способ отправки сообщений, даже если приложение находится в фоновом режиме и переднем плане: • Чтобы отправить сообщение с помощью API, вы можете использовать инструмент AdvancedREST Client, его расширение chrome и отправить сообщение со следующими параметрами.
Клиентский инструмент для restа Ссылка: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo
используйте этот URL-адрес: https://fcm.googleapis.com/fcm/send Content-Type: application / json. Авторизация: key = Ключ вашего сервера От или Автоимия (см. ниже)
{ "data": { "image": "https://static.pexels.com/photos/4825/red-love-romantic-flowers.jpg", "message": "Firebase Push Message Using API" "AnotherActivity": "True" }, "to" : "device id Or Device token" }
Ключ авторизации можно получить, посетив консоль разработчиков Google и нажмите кнопку «Учетные данные» в меню слева для вашего проекта. Среди перечисленных ключей API ключ сервера будет вашим ключом авторизации.
И вам нужно поместить токенID получателя в раздел «Кому» вашего запроса POST, отправленного с использованием API.
Спасибо всем вам за ваши ответы. Но я решил это, отправив сообщение данных вместо отправки Уведомления . Код сервера
'here is a message. message', 'title' => 'This is a title. title', 'subtitle' => 'This is a subtitle. subtitle', 'tickerText' => 'Ticker text here...Ticker text here...Ticker text here', 'vibrate' => 1, 'sound' => 1, 'largeIcon' => 'large_icon', 'smallIcon' => 'small_icon' ); $fields = array ( 'registration_ids' => $registrationIds, 'data' => $msg ); $headers = array ( 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' ); curl_setopt( $ch,CURLOPT_POST, true ); curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers ); curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false ); curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) ); $result = curl_exec($ch ); curl_close( $ch ); echo $result; ?>
И поймал данные в onMessageReceived
public class MyFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "MyFirebaseMsgService"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); sendNotification(remoteMessage.getData().get("message")); } // Check if message contains a notification payload. else if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); sendNotification(remoteMessage.getNotification().getBody()); } } private void sendNotification(String messageBody) { Intent intent = new Intent(this, Notify.class).putExtra("msg",messageBody); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT); String channelId = "idddd"; Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(MyFirebaseMessagingService.this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("FCM Message") .setContentText(messageBody) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); } }
Июнь 2018 Ответ –
Вы должны убедиться, что в сообщении отсутствует ключевое слово «уведомление». Включите только «данные», и приложение сможет обрабатывать сообщение в onMessageReceived, даже если в фоновом режиме или убито.
Использование облачных функций:
const message = { token: token_id, // obtain device token id by querying data in firebase data: { title: "my_custom_title", body: "my_custom_body_message" } } return admin.messaging().send(message).then(response => { // handle response });
Затем в вашем onMessageReceived () в вашем classе расширяется com.google.firebase.messaging.FirebaseMessagingService:
if (data != null) { Log.d(TAG, "data title is: " + data.get("title"); Log.d(TAG, "data body is: " + data.get("body"); } // build notification using the body, title, and whatever else you want.
В дополнение к вышеприведенным ответам. Если вы тестируете push-уведомления с помощью консоли FCM , ключ «данные» и объект не добавляются в пакет Push Notification. Таким образом, вы не будете получать подробное уведомление о том, когда приложение заложено или убито.
В этом случае вы должны выбрать консоль администратора консоли для тестирования сценария приложения.
Здесь вы добавите ключ «данных» в свой пакет push. поэтому детальный толчок будет показан, как ожидалось. Hope this helps few.
I’ve experienced the same problem and recompiled the firebase library and prevented it from sending notifications when the application is in the background
*library https://github.com/erdalceylan/com-google-firebase-messaging
dependencies { compile 'com.google.firebase:firebase-core:11.2.0' compile 'com.github.erdalceylan:com-google-firebase-messaging:v1-11.2.0' }
*
@WorkerThread public void onMessageReceived(RemoteMessage var1) { //your app is in background or foreground all time calling }
hope helps. Удачи