Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

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