Firebase onMessageReceived не вызывается, когда приложение в фоновом режиме

Я работаю с 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"));
        }
    }
}

Ответ 1

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

Вы можете указать click_action, чтобы указать намерение, которое должно быть запущено, когда уведомление используется пользователем. Основное действие используется, если не указано значение click_action.

Когда намерение запущено, вы можете использовать

getIntent().getExtras();

чтобы получить набор, который будет включать в себя любые данные, отправленные вместе с уведомлением.

Подробнее об уведомлении см. docs.

Ответ 2

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

Не забудьте включить поле "priority": "high" в запрос на уведомление. Согласно документации: сообщения данных отправляются с обычным приоритетом, поэтому они не будут поступать мгновенно; это также может быть проблемой.

Вот что я отправляю с сервера

{
  "data":{
    "id": 1,
    "missedRequests": 5
    "addAnyDataHere": 123
  },
  "to": "fhiT7evmZk8:APA91bFJq7Tkly4BtLRXdYvqHno2vHCRkzpJT8QZy0TlIGs......",
  "priority": "high"
}

Таким образом, вы можете получить свои данные в onMessageReceived(RemoteMessage message) как это.... допустим, я должен получить идентификатор

Object obj = message.getData().get("id");
        if (obj != null) {
            int id = Integer.valueOf(obj.toString());
        }

Ответ 3

этот метод handleIntent() устарел, поэтому обработку уведомления можно выполнить следующим образом:

  1. Состояние переднего плана: щелчок уведомления приведет к ожидающему выполнению намерения, которое вы предоставляете во время создания уведомления программно, как оно обычно создается с полезной нагрузкой данных уведомления.

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

Ответ 4

У меня была та же проблема. Легче использовать "сообщение данных" вместо "уведомления". Сообщение данных всегда загружает класс onMessageReceived.

В этом классе вы можете сделать свое собственное уведомление с помощью сборщика уведомлений.

Пример:

 @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        sendNotification(remoteMessage.getData().get("title"),remoteMessage.getData().get("body"));
    }

    private void sendNotification(String messageTitle,String messageBody) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,0 /* request code */, intent,PendingIntent.FLAG_UPDATE_CURRENT);

        long[] pattern = {500,500,500,500,500};

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_stat_name)
                .setContentTitle(messageTitle)
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setVibrate(pattern)
                .setLights(Color.BLUE,1,1)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }

Ответ 5

Вот более четкие понятия о сообщении Firebase. Я нашел это в их службе поддержки.

Firebase имеет три типа сообщений:

Уведомления: Уведомление работает на заднем или переднем плане. Когда приложение находится в фоновом режиме, уведомления уведомлений доставляются в системный трей. Если приложение находится на переднем плане, сообщения обрабатываются обратными вызовами onMessageReceived() или didReceiveRemoteNotification. По сути, это то, что называется отображением сообщений.

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

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

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

Со стороны сервера уведомление Firebase должно иметь формат:

Серверная сторона должна отправить объект "уведомления". Отсутствие объекта "уведомления" в моем 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. Я нашел это в их службе поддержки.

Для получения дополнительной информации посетите мою эту тему и эту тему

Ответ 6

В соответствии с документацией Firebase Cloud Messaging. Если "Активность" находится на переднем плане, тогда будет вызываться onMessageReceived. Если "Активность" находится в фоновом режиме или закрыта, в центре уведомлений отображается уведомление о запуске приложения. Вы можете вызвать свою настраиваемую активность при щелчке уведомления, если ваше приложение находится в фоновом режиме, вызвав службу api службы обслуживания для сообщений firebase как:

URL- https://fcm.googleapis.com/fcm/send

Тип метода - POST

Header- Content-Type:application/json
Authorization:key=your api key

Кузов/Payload:

{ "notification": {
    "title": "Your Title",
    "text": "Your Text",
     "click_action": "OPEN_ACTIVITY_1" // should match to your intent filter
  },
    "data": {
    "keyname": "any value " //you can get this data as extras in your activity and this data is optional
    },
  "to" : "to_id(firebase refreshedToken)"
} 

И с этим в вашем приложении вы можете добавить ниже код в свою деятельность для вызова:

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

Ответ 7

Если приложение находится в фоновом режиме или неактивно (убито), а вы нажимаете на Уведомление, вы должны проверить полезную нагрузку в LaunchScreen (в моем случае экран запуска это MainActivity.java).

Итак, в MainActivity.java на onCreate проверьте Дополнительно:

    if (getIntent().getExtras() != null) {
        for (String key : getIntent().getExtras().keySet()) {
            Object value = getIntent().getExtras().get(key);
            Log.d("MainActivity: ", "Key: " + key + " Value: " + value);
        }
    }

Ответ 8

У меня такая же проблема. Если приложение является передним - оно запускает мою фоновое обслуживание, где я могу обновить мою базу данных на основе типа уведомления. Но приложение переходит на задний план - служба уведомлений по умолчанию будет заботиться о том, чтобы показать уведомление пользователю.

Вот мое решение для идентификации приложения в фоновом режиме и запуска вашего фонового сервиса,

public class FirebaseBackgroundService extends WakefulBroadcastReceiver {

  private static final String TAG = "FirebaseService";

  @Override
  public void onReceive(Context context, Intent intent) {
    Log.d(TAG, "I'm in!!!");

    if (intent.getExtras() != null) {
      for (String key : intent.getExtras().keySet()) {
        Object value = intent.getExtras().get(key);
        Log.e("FirebaseDataReceiver", "Key: " + key + " Value: " + value);
        if(key.equalsIgnoreCase("gcm.notification.body") && value != null) {
          Bundle bundle = new Bundle();
          Intent backgroundIntent = new Intent(context, BackgroundSyncJobService.class);
          bundle.putString("push_message", value + "");
          backgroundIntent.putExtras(bundle);
          context.startService(backgroundIntent);
        }
      }
    }
  }
}

В файле manifest.xml

<receiver android:exported="true" android:name=".FirebaseBackgroundService" android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            </intent-filter>
        </receiver>

Протестировано это решение в последней версии Android 8.0. Благодаря

Ответ 9

Отмените метод handleIntent для FirebaseMessageService для меня.

здесь код в С# (Xamarin)

public override void HandleIntent(Intent intent)
{
    try
    {
        if (intent.Extras != null)
        {
            var builder = new RemoteMessage.Builder("MyFirebaseMessagingService");

            foreach (string key in intent.Extras.KeySet())
            {
                builder.AddData(key, intent.Extras.Get(key).ToString());
            }

            this.OnMessageReceived(builder.Build());
        }
        else
        {
            base.HandleIntent(intent);
        }
    }
    catch (Exception)
    {
        base.HandleIntent(intent);
    }
}

и это код в Java

public void handleIntent(Intent intent)
{
    try
    {
        if (intent.getExtras() != null)
        {
            RemoteMessage.Builder builder = new RemoteMessage.Builder("MyFirebaseMessagingService");

            for (String key : intent.getExtras().keySet())
            {
                builder.addData(key, intent.getExtras().get(key).toString());
            }

            onMessageReceived(builder.build());
        }
        else
        {
            super.handleIntent(intent);
        }
    }
    catch (Exception e)
    {
        super.handleIntent(intent);
    }
}

Ответ 10

По умолчанию активность Launcher в вашем приложении будет запущена, когда ваше приложение находится в фоновом режиме, и вы щелкаете уведомление, если у вас есть какая-либо часть данных с уведомлением, вы можете обрабатывать ее в том же действии, как показано ниже,

if(getIntent().getExtras()! = null){
  //do your stuff
}else{
  //do that you normally do
}

Ответ 11

Я реализовал этот простой способ отправки сообщений, даже если приложение закрыто, фон и на переднем плане тоже. Раньше я использовал консоль firebase, но я получаю только сообщения, а не изображения и пользовательские данные.

Чтобы отправить эти пользовательские данные с изображением, вы можете использовать инструмент под названием AdvancedREST Client, это расширение chrome и отправить сообщение со следующими параметрами:

Rest client tool Link: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo

используйте url:- https://fcm.googleapis.com/fcm/send Content-Type:application/json Authorization:key=Your Server key From or Authorization 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 и нажмите кнопку Credentials в левом меню для вашего проекта. Среди перечисленных ключей API ключ сервера будет вашим ключом авторизации.

И вам нужно разместить tokenID получателя в разделе to вашего запроса POST, отправленного с использованием API.

И эта часть кода android-кода//будет содержать Push-сообщение

String message = remoteMessage.getData().get("message1");

//imageUri will contain URL of the image to be displayed with Notification
String imageUri = remoteMessage.getData().get("image");

//If the key AnotherActivity has  value as True then when the user taps on notification, in the app AnotherActivity will be opened.
//If the key AnotherActivity has  value as False then when the user taps on notification, in the app MainActivity2 will be opened.
String TrueOrFlase = remoteMessage.getData().get("AnotherActivity");

//To get a Bitmap image from the URL received
bitmap = getBitmapfromUrl(imageUri);

sendNotification(message, bitmap, TrueOrFlase);

Ответ 12

Если приложение находится в фоновом режиме Пожарная база по умолчанию обрабатывает уведомление. Но если мы хотим получить наше пользовательское уведомление, мы должны изменить нашу сторону сервера, которая отвечает за отправку наших пользовательских данных (полезная нагрузка данных)

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

теперь ваш формат кода на стороне сервера выглядит следующим образом:

{
  "collapse_key": "CHAT_MESSAGE_CONTACT",
  "data": {
    "loc_key": "CHAT_MESSAGE_CONTACT",
    "loc_args": ["John Doe", "Contact Exchange"],
    "text": "John Doe shared a contact in the group Contact Exchange",
    "custom": {
      "chat_id": 241233,
      "msg_id": 123
    },
    "badge": 1,
    "sound": "sound1.mp3",
    "mute": true
  }
}

ПРИМЕЧАНИЕ: см. эту строку в приведенном выше коде

"текст": "Джон Доу поделился контактом в группе Contact Exchange" в полезной нагрузке Data вы должны использовать параметр "текст" вместо параметров "тело" или "сообщение" для описания сообщения или того, что вы хотите использовать.

onMessageReceived()

@Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.e(TAG, "From: " + remoteMessage.getData().toString());

        if (remoteMessage == null)
            return;

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
           /* Log.e(TAG, "Data Payload: " + remoteMessage.getData().toString());*/
            Log.e(TAG, "Data Payload: " + remoteMessage);

            try {

                Map<String, String> params = remoteMessage.getData();
                JSONObject json = new JSONObject(params);
                Log.e("JSON_OBJECT", json.toString());


                Log.e(TAG, "onMessageReceived: " + json.toString());

                handleDataMessage(json);
            } catch (Exception e) {
                Log.e(TAG, "Exception: " + e.getMessage());
            }
        }
    }

Ответ 13

Метод onMessageReceived (RemoteMessage remoteMessage), вызываемый в следующих случаях.

  • Ответ FCM с уведомлением и блоком данных :

{ "to": "список токенов устройства", "уведомление": { "тело": "Тело вашего уведомления", "title": "Название вашего уведомления" }, "data": { "body": "Тело вашего уведомления в данных", "title": "Название вашего уведомления в заголовке", "ключ_1": "значение для ключа_1", "image_url": "www.abc.com/xyz.jpeg", "key_2": "Значение для key_2" } }

  1. Приложение на переднем плане:

onMessageReceived (RemoteMessage remoteMessage) вызвал, показывает LargeIcon и BigPicture в панели уведомлений. Мы можем прочитать содержимое как из уведомлений, так и из блока данных block

  1. .Приложение в фоновом режиме:

onMessageReceived (RemoteMessage remoteMessage) не вызывается, системный трей получит сообщение и прочитает текст и заголовок из блока уведомлений и покажет сообщение и заголовок по умолчанию в панели уведомлений.

  • Ответ FCM Только с блоком данных :

В этом случае удаление блоков уведомлений из json

{ "to": "список токенов устройства", "data": { "body": "Тело вашего уведомления в данных", "title": "Название вашего уведомления в заголовке", "ключ_1": "значение для ключа_1", "image_url": "www.abc.com/xyz.jpeg", "key_2": "Значение для key_2" } }

  1. Приложение на переднем плане:

onMessageReceived (RemoteMessage remoteMessage) вызвал, показывает LargeIcon и BigPicture в панели уведомлений. Мы можем прочитать содержимое как из уведомлений, так и из блока данных block

  1. .Приложение в фоновом режиме:

При вызове onMessageReceived (RemoteMessage remoteMessage) системный трей не получит сообщение из-за того, что уведомлений ключ отсутствует в ответе. Показывает LargeIcon и BigPicture в панели уведомлений

Код

 private void sendNotification(Bitmap bitmap,  String title, String 
    message, PendingIntent resultPendingIntent) {

    NotificationCompat.BigPictureStyle style = new NotificationCompat.BigPictureStyle();
    style.bigPicture(bitmap);

    Uri defaultSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
    String NOTIFICATION_CHANNEL_ID = mContext.getString(R.string.default_notification_channel_id);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "channel_name", NotificationManager.IMPORTANCE_HIGH);

        notificationManager.createNotificationChannel(notificationChannel);
    }
    Bitmap iconLarge = BitmapFactory.decodeResource(mContext.getResources(),
            R.drawable.mdmlogo);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(mContext, NOTIFICATION_CHANNEL_ID)
            .setSmallIcon(R.drawable.mdmlogo)
            .setContentTitle(title)
            .setAutoCancel(true)
            .setSound(defaultSound)
            .setContentText(message)
            .setContentIntent(resultPendingIntent)
            .setStyle(style)
            .setLargeIcon(iconLarge)
            .setWhen(System.currentTimeMillis())
            .setPriority(Notification.PRIORITY_MAX)
            .setChannelId(NOTIFICATION_CHANNEL_ID);


    notificationManager.notify(1, notificationBuilder.build());


}

Ссылка:

https://firebase.google.com/docs/cloud-messaging/android/receive

Ответ 14

Просто позвоните в свой метод MainActivity onCreate:

if (getIntent().getExtras() != null) {
           // Call your NotificationActivity here..
            Intent intent = new Intent(MainActivity.this, NotificationActivity.class);
            startActivity(intent);
        }

Ответ 15

в соответствии с решением от t3h Exi я хотел бы опубликовать здесь чистый код. Просто поместите его в MyFirebaseMessagingService, и все работает отлично, если приложение находится в фоновом режиме. Вам нужно, по крайней мере, компилировать com.google.firebase: firebase-messaging: 10.2.1

 @Override
public void handleIntent(Intent intent)
{
    try
    {
        if (intent.getExtras() != null)
        {
            RemoteMessage.Builder builder = new RemoteMessage.Builder("MyFirebaseMessagingService");

            for (String key : intent.getExtras().keySet())
            {
                builder.addData(key, intent.getExtras().get(key).toString());
            }



           onMessageReceived(builder.build());
        }
        else
        {
            super.handleIntent(intent);
        }
    }
    catch (Exception e)
    {
        super.handleIntent(intent);
    }
}

Ответ 16

Попробуй это:

public void handleIntent(Intent intent) {
    try {
        if (intent.getExtras() != null) {
            RemoteMessage.Builder builder = new RemoteMessage.Builder("MyFirebaseMessagingService");
            for (String key : intent.getExtras().keySet()) {
            builder.addData(key, intent.getExtras().get(key).toString());
        }
            onMessageReceived(builder.build());
        } else {
            super.handleIntent(intent);
        }
    } catch (Exception e) {
        super.handleIntent(intent);
    }
}

Ответ 17

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

Здесь упоминается (но не так подчеркнуто в документации FCM):

https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages

Используйте свой сервер приложений и API-интерфейс FCM: установите только ключ данных. Возможно либо разборным, либо нескладным.

Ответ 18

Бэкэнд, с которым я работаю, использует Уведомления, а не сообщения данных. Поэтому, прочитав все ответы, я попытался извлечь дополнительные данные из набора намерений, которые приходят в запущенную деятельность. Но независимо от того, какие ключи я пытался извлечь из getIntent().getExtras();, значение всегда было нулевым.

Тем не менее, я наконец нашел способ отправить данные с помощью уведомлений и получить его из намерения.

Ключевым моментом здесь является добавление полезной нагрузки данных в сообщение "Уведомление".

Пример:

{
    "data": {
        "message": "message_body",
        "title": "message_title"
    },
    "notification": {
        "body": "test body",
        "title": "test title"
    },
    "to": "E4An.."
}

После этого вы сможете получить свою информацию таким образом:

intent.getExtras().getString("title") будет message_title

и intent.getExtras().getString("message") будет message_body

Ссылка

Ответ 19

Если ваша проблема связана с отображением Big Image i.e, если вы отправляете push-уведомление с изображением из консоли firebase и отображает изображение только в том случае, если приложение находится на переднем плане. Решение этой проблемы - отправить push-сообщение только с полем данных. Что-то вроде этого:

{ "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" }

Ответ 20

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

Вы можете проверить дополнительные значения в функциях oncreate() или onresume() основного действия.

Вы можете проверить поля, такие как данные, таблица и т.д. (Поле, указанное в уведомлении)

например я отправил с использованием данных в качестве ключа

public void onResume(){
    super.onResume();
    if (getIntent().getStringExtra("data")!=null){
            fromnotification=true;
            Intent i = new Intent(MainActivity.this, Activity2.class);
            i.putExtra("notification","notification");
            startActivity(i);
        }

}

Ответ 21

У меня была эта проблема (приложение не хочет открывать при уведомлении, если приложение находится в фоновом режиме или закрыто), а проблема была недопустимой click_action в теле уведомления, попробуйте удалить или изменить ее на что-то действительное.

Ответ 22

У меня была одна и та же проблема, и я сделал еще кое-что. Когда приложение находится в фоновом режиме, в системный трей отправляется сообщение уведомление, НО < сообщение отправляется на 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-интерфейс FCM: установите только ключ данных. Может быть либо разборным, либо не сбрасываемым".
См. https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages

Ответ 23

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

Ответ 24

Существует 2 типа push-уведомлений Firebase:

1- Уведомляющее сообщение (Отображаемое сообщение) → - 1.1 Если вы выберете этот вариант, ОС создаст свое собственное уведомление, если приложение находится в фоновом режиме, и передаст данные в intent. Тогда это до клиента, чтобы обработать эти данные.

- 1.2 Если приложение находится на переднем плане, то уведомление будет получено через callback-function в FirebaseMessagingService и до клиента, чтобы обработать его.

2- Сообщения с данными (до 4 тыс. Данных) → Эти сообщения используются для отправки только данных клиенту (без вывода сообщений) и до клиента для обработки этих данных в обоих случаях: фон/передний план через функцию обратного вызова в FirebaseMessagingService

Это в соответствии с официальными документами: https://firebase.google.com/docs/cloud-messaging/concept-options

Ответ 25

Просто переопределите метод OnCreate в FirebaseMessagingService. Он вызывается, когда ваше приложение находится в фоновом режиме:

public override void OnCreate()
{
    // your code
    base.OnCreate();
}