Receber mensagens em um app Android

O servi�o Firebase Notifica��es se comporta de maneira diferente dependendo do estado em primeiro/segundo plano do app de destino. Se voc� quer que apps em primeiro plano recebam mensagens de notifica��o ou de dados, escreva o c�digo para processar a callback onMessageReceived. Veja uma explica��o sobre a diferen�a entre as mensagens de notifica��o e de dados em Tipos de mensagem.

Como processar mensagens

Para receber mensagens, use um servi�o que amplie o FirebaseMessagingService. Seu servi�o precisa substituir as callbacks onMessageReceived e onDeletedMessages. Ele deve processar qualquer mensagem em at� 20 segundos ap�s o recebimento (10 segundos no Android Marshmallow). O per�odo pode ser mais curto, dependendo dos atrasos do SO incorridos antes de chamar onMessageReceived. Depois disso, v�rios comportamentos do SO, como os limites de execu��o em segundo plano do Android O, podem interferir na capacidade de concluir seu trabalho. Para mais informa��es, consulte nossa vis�o geral sobre prioridade de mensagens.

O onMessageReceived est� dispon�vel para a maioria dos tipos de mensagens, com as seguintes exce��es:

  • Mensagens de notifica��o entregues quando seu app estiver em segundo plano. Nesse caso, a notifica��o � entregue � bandeja do sistema do dispositivo. Quando um usu�rio toca na notifica��o, a tela de in�cio do app � aberta por padr�o.

  • Mensagens com payload de notifica��o e dados, quando recebidas em segundo plano. Nesse caso, a notifica��o � entregue � bandeja do sistema do dispositivo, e o payload de dados � entregue nos extras da intent da atividade da sua tela de in�cio.

Em resumo:

Estado do app Notifica��o Dados Ambos
Primeiro plano onMessageReceived onMessageReceived onMessageReceived
Segundo plano Bandeja do sistema onMessageReceived Notifica��o: bandeja do sistema
Dados: nos extras da intent.
Para mais informa��es sobre os tipos de mensagens, consulte Notifica��es e mensagens de dados.

Editar o manifesto do app

Para usar FirebaseMessagingService, adicione o seguinte ao manifesto do seu app:

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

Al�m disso, recomendamos que voc� defina valores padr�o para personalizar a apar�ncia das notifica��es. � poss�vel especificar uma cor e um �cone padr�o personalizados que ser�o aplicados sempre que valores equivalentes n�o estiverem definidos no payload da notifica��o.

Adicione estas linhas na tag application para definir a cor e o �cone padr�o personalizados:

<!-- 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" />

O Android exibe o �cone personalizado padr�o para:

  • todas as mensagens de notifica��o enviadas pelo Editor do Notifica��es;
  • todas as mensagens de notifica��o que n�o definem explicitamente o �cone no payload da notifica��o.

O Android usa a cor padr�o personalizada para:

  • todas as mensagens de notifica��o enviadas pelo Editor do Notifica��es;
  • todas as mensagens de notifica��o que n�o definem explicitamente a cor no payload de notifica��o.

Se n�o houver um �cone personalizado padr�o ou nenhum �cone estiver definido no payload de notifica��o, o Android exibir� o �cone do aplicativo renderizado na cor branca.

Substituir onMessageReceived

Ao substituir o m�todo FirebaseMessagingService.onMessageReceived, � poss�vel realizar a��es com base no objeto RemoteMessage recebido e acessar os dados da mensagem:

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

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

Substituir onDeletedMessages

Em algumas situa��es, � poss�vel que o FCM n�o entregue uma mensagem. Isso ocorre quando h� muitas mensagens pendentes (mais de 100) no app em um dispositivo espec�fico no momento em que ele � conectado ou se o dispositivo n�o for conectado ao FCM por mais de um m�s. Nesses casos, talvez voc� receba uma callback para FirebaseMessagingService.onDeletedMessages(). Quando isso acontece, a inst�ncia do app precisa executar uma sincroniza��o completa com o servidor do app. Se voc� n�o enviou uma mensagem ao app no dispositivo nas �ltimas quatro semanas, o FCM n�o vai chamar onDeletedMessages().

Processar mensagens de notifica��o em um app em segundo plano

Quando seu app est� em segundo plano, o Android direciona as notifica��es para a bandeja do sistema. Quando um usu�rio toca nelas, a tela de in�cio do aplicativo � aberta por padr�o.

Isso inclui mensagens que cont�m payload de notifica��o e dados, assim como todas aquelas enviadas pelo console do Notifica��es. Nesses casos, a notifica��o � entregue � bandeja do sistema do dispositivo, e o payload de dados � entregue nos extras da intent da atividade da tela de in�cio.

Confira as informa��es sobre a entrega de mensagens ao seu app no painel de relat�rios do FCM, que registra o n�mero de mensagens enviadas e abertas em dispositivos Apple e Android, al�m de dados de "impress�es" (notifica��es vistas pelos usu�rios) para apps Android.

Receber mensagens do FCM no modo de inicializa��o direta

Os desenvolvedores que quiserem enviar mensagens do FCM para apps antes mesmo do dispositivo ser desbloqueado poder�o permitir que um app para Android receba mensagens quando o dispositivo estiver no modo de inicializa��o direta. Por exemplo, talvez voc� queira que os usu�rios do seu app recebam notifica��es de alarme mesmo em um dispositivo bloqueado.

Ao criar esse caso de uso, observe as pr�ticas recomendadas e restri��es gerais para o modo de inicializa��o direta. � especialmente importante considerar a visibilidade das mensagens enviadas na inicializa��o direta. Qualquer usu�rio com acesso ao dispositivo poder� ver essas mensagens sem digitar as credenciais do usu�rio.

Pr�-requisitos

  • O dispositivo precisa estar configurado para o modo de inicializa��o direta.
  • O dispositivo precisa ter uma vers�o recente do Google Play Services instalada (19.0.54 ou superior).
  • O app precisa usar o SDK do FCM (com.google.firebase:firebase-messaging) para receber mensagens do FCM.

Ativar o gerenciamento de mensagens no modo de inicializa��o direta no seu app

  1. No arquivo Gradle no n�vel do app, adicione uma depend�ncia � biblioteca de suporte da inicializa��o direta do FCM:

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. Adicione o atributo android:directBootAware="true" ao manifesto do app para fazer FirebaseMessagingService funcionar na inicializa��o direta:

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

� importante garantir que FirebaseMessagingService possa ser executado no modo de inicializa��o direta. Verifique os seguintes requisitos:

  • O servi�o n�o deve acessar o armazenamento protegido por credenciais durante a execu��o no modo de inicializa��o direta.
  • O servi�o n�o deve tentar usar componentes, como Activities, BroadcastReceivers ou outros Services que n�o est�o marcados para funcionar no modo de inicializa��o direta.
  • Todas as bibliotecas que o servi�o usar tamb�m n�o poder�o acessar o armazenamento protegido por credenciais nem chamar componentes non-directBootAware durante a execu��o no modo de inicializa��o direta. Isso significa que todas as bibliotecas que o app usa e que s�o chamadas usando o servi�o precisam estar marcadas para funcionar na inicializa��o direta ou o app deve verificar se ele est� em execu��o no modo de inicializa��o direta para n�o chamar as bibliotecas se esse for o caso. Por exemplo, os SDKs do Firebase funcionam com a inicializa��o direta (eles podem ser inclu�dos em um app sem causar falhas nesse modo), mas muitas APIs do Firebase n�o s�o compat�veis com a inicializa��o direta.
  • Se o app est� usando um Application personalizado, o Application tamb�m precisa estar marcado para funcionar na inicializa��o direta (sem acesso ao armazenamento protegido por credenciais no modo de inicializa��o direta).

Para ver como enviar mensagens para dispositivos no modo de inicializa��o direta, consulte este link.