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

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


To receive messages, you can use a service that extends FirebaseMessagingService . Your service should override the onMessageReceived and onDeletedMessages callbacks. For a complete example, see the Firebase Cloud Messaging quickstart sample .

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

  • Notification messages delivered when your app is in the background . In this case, the notification is delivered to the device's system tray. A user tap on a notification opens the app launcher by default.

  • Messages with both notification and data payload, when received in the background . In this case, the notification is delivered to the device's system tray, and the data payload is delivered in the extras of the intent of your launcher Activity.

В итоге:

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

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

The onMessageReceived callback has a short execution window. Many factors can affect how long this window is, including OS delays, app startup time, the main thread being blocked by other operations, or previous onMessageReceived calls taking too long.

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

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

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

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

It's recommended to set default values to customize the appearance of notifications. You can specify a custom default icon and a custom default color that are applied whenever equivalent values aren't set in the notification payload.

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

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

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

This includes messages that contain both notification and data payload (and all messages sent from the Notifications composer in the Firebase console). In these cases, the notification is delivered to the device's system tray, and the data payload is delivered in the extras of the intent of your launcher Activity.

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