Получайте сообщения в приложениях для Android.

Выберите платформу: iOS+ Android Web Flutter Unity C++


Для получения сообщений можно использовать сервис, расширяющий класс FirebaseMessagingService . Ваш сервис должен переопределить коллбэки onMessageReceived и onDeletedMessages . Полный пример см. в кратком руководстве по Firebase Cloud Messaging .

onMessageReceived предоставляется для большинства типов сообщений, за исключением следующих:

  • Уведомления доставляются, когда ваше приложение находится в фоновом режиме . В этом случае уведомление отображается в системном трее устройства. По умолчанию, нажатие на уведомление открывает панель запуска приложений.

  • Сообщения, содержащие как уведомление, так и данные, при получении в фоновом режиме . В этом случае уведомление доставляется в системный трей устройства, а данные — в дополнительные параметры интента вашей Activity запуска.

В итоге:

Состояние приложения Уведомление Данные Оба
Передний план onMessageReceived onMessageReceived onMessageReceived
Фон Системный трей onMessageReceived Уведомление: в системном трее. Данные: в дополнительных параметрах намерения.

Для получения дополнительной информации о типах сообщений см. раздел «Уведомления и сообщения с данными» .

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

По этой причине следует избегать длительных задач (например, получения изображений с сервера для отображения в уведомлении) в onMessageReceived и вместо этого планировать задачу с помощью WorkManager для обработки любых задач, выполнение которых может занять более нескольких секунд. Дополнительную информацию о приоритете сообщений и его влиянии на обработку см. в разделе «Обработка сообщений с высоким и обычным приоритетом» .

Отредактируйте манифест приложения.

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

<service
    android:name=".java.MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

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

Добавьте эти строки внутрь тега application , чтобы установить пользовательскую иконку по умолчанию и пользовательский цвет:

<!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
     See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
     notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/colorAccent" />

Android отображает и использует пользовательскую иконку по умолчанию для

  • Все уведомления отправляются из редактора уведомлений .
  • Любое уведомление, в котором значок явно не задан в содержимом уведомления.

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

Переопределить onMessageReceived

Переопределив метод FirebaseMessagingService.onMessageReceived , вы можете выполнять действия на основе полученного объекта RemoteMessage и получать данные сообщения:

Kotlin

override fun onMessageReceived(remoteMessage: RemoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: ${remoteMessage.from}")

    // Check if message contains a data payload.
    if (remoteMessage.data.isNotEmpty()) {
        Log.d(TAG, "Message data payload: ${remoteMessage.data}")

        // Check if data needs to be processed by long running job
        if (needsToBeScheduled()) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            scheduleJob()
        } else {
            // Handle message within 10 seconds
            handleNow()
        }
    }

    // Check if message contains a notification payload.
    remoteMessage.notification?.let {
        Log.d(TAG, "Message Notification Body: ${it.body}")
    }

    // 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.
}

Java

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    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());

        if (/* Check if data needs to be processed by long running job */ true) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            scheduleJob();
        } else {
            // Handle message within 10 seconds
            handleNow();
        }

    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    }

    // 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.
}

Переопределить onDeletedMessages

В некоторых ситуациях FCM может не доставить сообщение. Это происходит, когда на конкретном устройстве в момент подключения слишком много ожидающих сообщений (>100) для вашего приложения или если устройство не подключалось к FCM более месяца. В таких случаях вы можете получить обратный вызов FirebaseMessagingService.onDeletedMessages() . Когда экземпляр приложения получит этот обратный вызов, он должен выполнить полную синхронизацию с вашим сервером приложений. Если вы не отправляли сообщения приложению на этом устройстве в течение последних 4 недель, FCM не вызовет onDeletedMessages() .

Обработка уведомлений в фоновом приложении.

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

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

Для получения более подробной информации о доставке сообщений в ваше приложение см. панель отчетов FCM , которая регистрирует количество отправленных и открытых сообщений на устройствах Apple и Android, а также данные о «показах» (уведомлениях, просмотренных пользователями) для приложений Android.