Как получать сообщения в приложениях Android

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


Чтобы получать сообщения, вы можете использовать сервис, который расширяет FirebaseMessagingService. Если вы переходите на AndroidConfigV2, реализуйте специализированные обратные вызовы onNotificationReceived и onBackgroundSyncReceived, как описано в разделе Обновление обратных вызовов клиента Android. Для устаревших сообщений AndroidConfig (версии 1) ваш сервис должен переопределять обратные вызовы onMessageReceived и onDeletedMessages. Полный пример можно найти в кратком руководстве по Firebase Cloud Messaging.

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

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

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

В целом можно выделить следующее.

Состояние приложения Уведомление Данные Оба варианта
Цвет переднего плана 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 показывает и использует специальный значок по умолчанию для

  • Все уведомления, отправленные из Компоновщика уведомлений в консоли Firebase.

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

Если значок по умолчанию не задан и не указан в полезной нагрузке уведомления, 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(). Когда экземпляр приложения получает этот обратный вызов, он должен выполнить полную синхронизацию с сервером приложения. Если вы не отправляли сообщения в приложение на этом устройстве в течение последних четырех недель, FCM не будет звонить пользователю onDeletedMessages().

Как обрабатывать уведомления в фоновом режиме

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

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

Чтобы получить статистику по доставке сообщений в ваше приложение, в консоли Firebase перейдите на панель управления DevOps & Engagement (DevOps и вовлеченность) > Messaging (Обмен сообщениями) > Reports (Отчеты). На этой панели управления регистрируется количество сообщений, отправленных и открытых на устройствах Apple и Android, а также данные о показах (уведомлениях, увиденных пользователями) для приложений Android.