Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

Уведомления Firebase ведут себя по-разному в зависимости от состояния переднего или заднего плана принимающего приложения. Если вы хотите приложение на передний план , чтобы получать сообщения уведомления или сообщения данных, вам нужно код записи для обработки onMessageReceived обратного вызова. Для объяснения разницы между уведомлением и данными сообщениями см Типов сообщений .

Обработка сообщений

Для получения сообщений, используйте сервис , который расширяет FirebaseMessagingService . Ваша служба должна переопределить onMessageReceived и onDeletedMessages обратных вызовов. Он должен обрабатывать любое сообщение в течение 20 секунд после получения (10 секунд на Android Marshmallow). Время может быть короче , в зависимости от задержек ОС понесены перед призванием onMessageReceived . После этого, различные формы поведения , такие как OS Android Выходов пределы исполнения фон может мешать вашей способности завершить свою работу. Для получения дополнительной информации посетите наш обзор приоритет сообщений .

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

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

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

В итоге:

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

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

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

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

Android использует собственный цвет по умолчанию для

  • Все сообщения уведомления , отправленные с композитором Notifications .
  • Любое уведомление, в котором явно не установлен цвет в полезных данных уведомления.

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

Override onMessageReceived

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

Джава

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

Котлин + KTX

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

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

Override onDeletedMessages

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

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

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

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

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

Фоновые приложения с ограниченным доступом (Android P или новее)

FCM не может доставить сообщения приложения , которые были введены в ограничение фона пользователем (например, с помощью: Настройка -> Приложения и уведомления -> [имя_приложения] -> Аккумулятор). Как только ваше приложение будет удалено из-под фонового ограничения, новые сообщения в приложение будут доставляться, как и раньше. Для предотвращения потери сообщений и других последствий ограничения фона, убедитесь , чтобы избежать плохого поведения , перечисленное в Android Vitals усилий. Такое поведение может привести к тому, что устройство Android порекомендует пользователю ограничить использование вашего приложения в фоновом режиме. Ваше приложение может проверить , если это фон ограничено использованием: isBackgroundRestricted () .

Получать сообщения FCM в режиме прямой загрузки

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

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

Предпосылки

  • Устройство должно быть настроено для режима прямой загрузки.
  • На устройстве должна быть установлена ​​последняя версия сервисов Google Play (19.0.54 или новее).
  • Приложение должно быть с помощью FCM SDK ( com.google.firebase:firebase-messaging ) , чтобы получать сообщения ТСМ.

Включите в приложении обработку сообщений в режиме прямой загрузки

  1. В файле Gradle уровня приложения добавьте зависимость от библиотеки поддержки прямой загрузки FCM:

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. Сделать приложение в FirebaseMessagingService прямой загрузки известно, добавив android:directBootAware="true" атрибут в приложении манифеста:

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

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

  • Служба не должна получать доступ к хранилищу, защищенному учетными данными, при работе в режиме прямой загрузки.
  • Служба не должна пытаться использовать компоненты, такие как Activities , BroadcastReceivers или другие Services , которые не помечены как прямая загрузка осведомлена во время работы в прямом режиме загрузки.
  • Любые библиотеки, которые использует служба, также не должны обращаться к хранилищу, защищенному учетными данными, или вызывать компоненты non-directBootAware во время работы в режиме прямой загрузки. Это означает, что любые библиотеки, которые использует приложение и которые вызываются из службы, либо должны поддерживать прямую загрузку, либо приложению необходимо будет проверять, работает ли оно в режиме прямой загрузки, а не вызывать их в этом режиме. Например, SDK Firebase работают с прямой загрузкой (их можно включить в приложение без сбоев в режиме прямой загрузки), но многие API Firebase не поддерживают вызов в режиме прямой загрузки.
  • Если приложение использует пользовательские Application , то Application также должно быть прямой загрузкой в курсе (нет доступа к защищенному хранилищу учетных данных в прямом режиме загрузки).

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