Cómo gestionar la notificación cuando la aplicación está en segundo plano en Firebase

Aquí está mi manifiesto

          

Cuando la aplicación está en segundo plano y llega una notificación, llega la notificación predeterminada y no ejecuta mi código de onMessageReceived .

Aquí está mi código onMessageReceived . Esto invoca si mi aplicación se ejecuta en primer plano, no cuando la aplicación está en segundo plano. ¿Cómo ejecutar este código cuando la aplicación está en segundo plano también?

 // [START receive_message] @Override public void onMessageReceived(RemoteMessage remoteMessage) { // TODO(developer): Handle FCM messages here. // If the application is in the foreground handle both data and notification messages here. // 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. data = remoteMessage.getData(); String title = remoteMessage.getNotification().getTitle(); String message = remoteMessage.getNotification().getBody(); String imageUrl = (String) data.get("image"); String action = (String) data.get("action"); Log.i(TAG, "onMessageReceived: title : "+title); Log.i(TAG, "onMessageReceived: message : "+message); Log.i(TAG, "onMessageReceived: imageUrl : "+imageUrl); Log.i(TAG, "onMessageReceived: action : "+action); if (imageUrl == null) { sendNotification(title,message,action); } else { new BigPictureNotification(this,title,message,imageUrl,action); } } // [END receive_message] 

1. ¿Por qué está pasando esto?

Hay dos tipos de mensajes en FCM (Firebase Cloud Messaging):

  1. Mostrar mensajes : estos mensajes desencadenan la callback onMessageReceived() solo cuando su aplicación está en primer plano
  2. Mensajes de datos : estos mensajes desencadenan la callback onMessageReceived() incluso si su aplicación está en primer plano / fondo / asesinado

El equipo de Firebase aún no desarrolló una interfaz de usuario para enviar data-messages a sus dispositivos.

2. ¿Cómo?

Para lograr esto, debe realizar una solicitud POST a la siguiente URL:

POST https://fcm.googleapis.com/fcm/send

Encabezados

  • Clave: tipo de Content-Type , valor: application/json
  • Clave: Authorization , Valor: key=

Cuerpo usando temas

 { "to": "/topics/my_topic", "data": { "my_custom_key": "my_custom_value", "my_custom_key2": true } } 

O si desea enviarlo a dispositivos específicos

 { "data": { "my_custom_key": "my_custom_value", "my_custom_key2": true }, "registration_ids": ["{device-token}","{device2-token}","{device3-token}"] } 

NOTA: asegúrese de no agregar la notification clave JSON
NOTA: Para obtener su clave de servidor, puede encontrarla en la consola de firebase: Your project -> settings -> Project settings -> Cloud messaging -> Server Key

3. ¿Cómo manejar el mensaje de notificación de inserción?

Así es como manejas el mensaje recibido:

 @Override public void onMessageReceived(RemoteMessage remoteMessage) { Map data = remoteMessage.getData(); String myCustomKey = data.get("my_custom_key"); // Manage data } 

Para hacer que la biblioteca de firebase llame a su onMessageReceived () en los siguientes casos

  1. Aplicación en primer plano
  2. Aplicación en segundo plano
  3. La aplicación ha sido asesinada

no debe poner la ‘notificación’ de la clave JSON en su solicitud a la API de firebase, sino usar ‘datos’, ver a continuación.

El siguiente mensaje no llamará a su onMessageReceived () cuando su aplicación está en segundo plano o muerta, y no puede personalizar su notificación.

 { "to": "/topics/journal", "notification": { "title" : "title", "text": "data!", "icon": "ic_notification" } } 

pero en cambio usar esto funcionará

 { "to": "/topics/dev_journal", "data": { "text":"text", "title":"", "line1":"Journal", "line2":"刊物" } } 

Básicamente, el mensaje se envía en el argumento RemoteMessage junto con su objeto de datos como Map, luego puede administrar la notificación en onMessageReceived como en el fragmento aquí

 @Override public void onMessageReceived(RemoteMessage remoteMessage) { Map data = remoteMessage.getData(); //you can get your text message here. String text= data.get("text"); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) // optional, this is to make beautiful icon .setLargeIcon(BitmapFactory.decodeResource( getResources(), R.mipmap.ic_launcher)) .setSmallIcon(smallIcon) //mandatory ....... /*You can read more on notification here: https://developer.android.com/training/notify-user/build-notification.html https://www.youtube.com/watch?v=-iog_fmm6mE */ } 

Siento que todas las respuestas están incompletas, pero todas tienen algo que necesitas para procesar una notificación que contiene datos cuando tu aplicación está en segundo plano.

Sigue estos pasos y podrás procesar tus notificaciones cuando tu aplicación esté en segundo plano.

1.Añada un filtro de intención como este:

       

a una actividad que desea procesar los datos de notificación.

  1. Enviar notificaciones con el siguiente formato:

     { "notification" : { "click_action" : ".MainActivity", "body" : "new Symulti update !", "title" : "new Symulti update !", "icon" : "ic_notif_symulti" }, "data": { ... }, "to" : "c9Vaa3ReGdk:APA91bH-AuXgg3lDN2WMcBrNhJZoFtYF9" } 

La clave aquí es agregar

 "click_action" : ".MainActivity" 

donde .MainActivity es la actividad con el filtro de intención que agregó en el paso 1.

  1. Obtenga información de “datos” de la notificación en el onCreate de “.MainActivity”:

     protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //get notification data info Bundle bundle = getIntent().getExtras(); if (bundle != null) { //bundle must contain all info sent in "data" field of the notification } } 

Y eso debería ser todo lo que necesitas hacer. Espero que esto ayude a alguien 🙂

De acuerdo con los documentos

Manejar mensajes en una aplicación de fondo

Cuando su aplicación está en segundo plano, Android dirige los mensajes de notificación a la bandeja del sistema. Un usuario toca la notificación abre el iniciador de aplicaciones de forma predeterminada.

Esto incluye mensajes que contienen notificaciones y carga de datos. En estos casos, la notificación se entrega a la bandeja del sistema del dispositivo, y la carga útil de datos se entrega en los extras de la actividad de su iniciador.

Si desea abrir su aplicación y realizar una acción específica, establezca click_action en la carga de notificación y asígnela a un filtro de intención en la actividad que desea iniciar. Por ejemplo, establezca click_action en OPEN_ACTIVITY_1 para activar un filtro de intención como el siguiente:

      

Editar:

Basado en este hilo :

No puede configurar la carga útil de click_action con Firebase Console. Podría intentar probar con un comando curl o un servidor http personalizado

 curl --header "Authorization: key=" --header Content-Type:"application/json" https://fcm.googleapis.com/fcm/send -d "{\"to\":\"/topics/news\",\"notification\": {\"title\": \"Click Action Message\",\"text\": \"Sample message\", \"click_action\":\"OPEN_ACTIVITY_1\"}}" 

De acuerdo con la documentación de firebase en el envío descendente utilizando firebase , hay 2 tipos de carga útil:

  1. datos

    Este parámetro especifica los pares clave-valor personalizados de la carga del mensaje. La aplicación del cliente es responsable de procesar los mensajes de datos. Los mensajes de datos solo tienen pares de clave-valor personalizados.

  2. notificación

    Este parámetro especifica los pares clave-valor predefinidos y visibles para el usuario de la carga útil de notificación. FCM muestra automáticamente el mensaje a los dispositivos del usuario final en nombre de la aplicación del cliente. Los mensajes de notificación tienen un conjunto predefinido de claves visibles para el usuario.

Cuando estás en primer plano puedes obtener los datos dentro de FCM usando onMessageReceived () , puedes obtener tus datos de la carga de datos .

 data = remoteMessage.getData(); String customData = (String) data.get("customData"); 

Cuando está en segundo plano, FCM mostrará la notificación en la bandeja del sistema según la información de la carga de notificación . El título, el mensaje y el ícono que se usaron para la notificación en la bandeja del sistema se obtienen de la carga de notificación .

 { "notification": { "title" : "title", "body" : "body text", "icon" : "ic_notification" } } 

Esta carga útil de notificación se usa cuando desea mostrar automáticamente la notificación en la bandeja del sistema cuando su aplicación está en segundo plano. Para obtener datos de notificación cuando su aplicación está en segundo plano, debe agregar click_action dentro de la carga de notificación .

Si desea abrir su aplicación y realizar una acción específica [mientras está en segundo plano], establezca click_action en la carga de notificación y asóciela a un filtro de intención en la Actividad que desea iniciar. Por ejemplo, establezca click_action en OPEN_ACTIVITY_1 para activar un filtro de intención como el siguiente:

     

Pon ese filtro de intención en tu manifiesto, dentro de la etiqueta de la aplicación. Al hacer clic en la notificación, se abrirá la aplicación y se dirigirá directamente a la actividad que defina en click_action, en este caso “OPEN_ACTIVTY_1”. Y dentro de esa actividad puedes obtener los datos por:

 Bundle b = getIntent().getExtras(); String someData = b.getString("someData"); 

Estoy usando FCM para mi aplicación de Android y uso ambas cargas. Aquí está el ejemplo JSON que estoy usando:

 { "to": "FCM registration ID", "notification": { "title" : "title", "body" : "body text", "icon" : "ic_notification" }, "data": { "someData" : "This is some data", "someData2" : "etc" } } 

Dado que los display-messages que se envían desde la UI de notificación de Firebase solo funcionan si la aplicación está en primer plano. Para data-messages , es necesario realizar una llamada POST a FCM

Pasos

  1. Instalar la extensión de Google Chrome para el cliente de descanso avanzado enter image description here

  2. Agregue los siguientes encabezados

    Clave : tipo de contenido, valor : aplicación / json

    Clave : Autorización, valor : clave = “su clave de servidor” enter image description here

  3. Agrega el cuerpo

    • Si usa temas:

       { "to" : "/topics/topic_name", "data": { "key1" : "value1", "key2" : "value2", } } 
    • Si usa la ID de registro:

       { "registration_ids" : "[{"id"},{id1}]", "data": { "key1" : "value1", "key2" : "value2", } } 

¡Eso es!. Ahora escucha onMessageReceived callback como de costumbre.

 @Override public void onMessageReceived(RemoteMessage remoteMessage) { Map data = remoteMessage.getData(); String value1 = data.get("key1"); String value2 = data.get("key2"); } 
 @Override public void onMessageReceived(RemoteMessage remoteMessage) { } 

no se llama cada vez que se llama solo cuando la aplicación está en forground

hay un método de sustitución que se llama este método cada vez, sin importar qué aplicación esté en primer plano o en segundo plano o que se haya matado, pero este método está disponible con esta versión de Firebase API

esta es la versión que tienes que importar de gradle

 compile 'com.google.firebase:firebase-messaging:10.2.1' 

este es el método

 @Override public void handleIntent(Intent intent) { super.handleIntent(intent); // you can get ur data here //intent.getExtras().get("your_data_key") } 

con la API previa de Firebase, este método no estaba allí, así que en ese caso, la base de Fire Mango solo cuando la aplicación está en segundo plano … ahora tienes este método que quieras hacer … puedes hacerlo aquí en este método … …

si está utilizando una versión anterior a la que se iniciará la actividad predeterminada, en ese caso puede obtener datos de la misma manera

 if(getIntent().getExtras() != null && getIntent().getExtras().get("your_data_key") != null) { String strNotificaiton = getIntent().getExtras().get("your_data_key").toString(); 

// Haz lo que quieras …. }

En general, esta es la estructura del servidor que obtenemos en la notificación

 { "notification": { "body": "Cool offers. Get them before expiring!", "title": "Flat 80% discount", "icon": "appicon", "click_action": "activity name" //optional if required..... }, "data": { "product_id": 11, "product_details": "details.....", "other_info": "......." } } 

depende de ti cómo quieres dar esa clave de datos o quieres dar una notificación de todo lo que puedas dar … lo que quieras dar aquí con la misma clave obtendrás esa información …….. .

Hay pocos casos si no envía una acción de clic en ese caso cuando haga clic en notificación, la actividad predeterminada se abrirá, pero si desea abrir su actividad específica cuando la aplicación está en segundo plano, puede invocar su actividad desde este en el método handleIntent porque esto se llama todo el tiempo

Para capturar el mensaje en segundo plano necesita usar un BroadcastReceiver

 public class FirebaseDataReceiver extends WakefulBroadcastReceiver { private final String TAG = "FirebaseDataReceiver"; public void onReceive(Context context, Intent intent) { Log.d(TAG, "I'm in!!!"); Bundle dataBundle = intent.getBundleExtra("data"); Log.d(TAG, dataBundle.toString()); } } 

y agrega esto a tu manifiesto:

      

Aquí hay conceptos más claros sobre el mensaje de Firebase. Lo encontré de su equipo de soporte.

Firebase tiene tres tipos de mensajes :

Mensajes de notificación : el mensaje de notificación funciona en segundo plano o en primer plano. Cuando la aplicación está en segundo plano, los mensajes de notificación se envían a la bandeja del sistema. Si la aplicación está en primer plano, los mensajes son manejados por onMessageReceived() o didReceiveRemoteNotification . Estos son esencialmente lo que se conoce como Mostrar mensajes.

Mensajes de datos : en la plataforma Android, el mensaje de datos puede funcionar en segundo plano y en primer plano. El mensaje de datos será manejado por onMessageReceived (). Una nota específica de la plataforma aquí sería: en Android, la carga útil de datos se puede recuperar en la intención utilizada para iniciar su actividad. Para más detalles, si tiene "click_action":"launch_Activity_1" , puede recuperar esta intención a través de getIntent() solo desde Activity_1 .

Mensajes con cargas de datos y notificaciones : cuando están en segundo plano, las aplicaciones reciben la carga de notificación en la bandeja de notificaciones y solo manejan la carga de datos cuando el usuario toca la notificación. Cuando está en primer plano, su aplicación recibe un objeto de mensaje con ambas cargas disponibles. En segundo lugar, el parámetro click_action se usa a menudo en la carga de notificación y no en la carga de datos. Si se utiliza dentro de la carga útil de datos, este parámetro se trataría como un par clave-valor personalizado y, por lo tanto, tendría que implementar una lógica personalizada para que funcione de la manera prevista.

Además, le recomiendo que use el método onMessageReceived (consulte Mensaje de datos) para extraer el paquete de datos. De su lógica, verifiqué el objeto del paquete y no encontré el contenido de datos esperado. Aquí hay una referencia a un caso similar que podría proporcionar más claridad.

Para más información visita mi este hilo

Respuesta actualizada 2017

Aquí hay una respuesta clara de los documentos con respecto a esto:

enter image description here

Descubrí los escenarios,

Cuando la aplicación está en primer plano , se llama al método onMessageReceived () desde FirebaseService . Así se llamará al pendiente pendingIntent definido en la clase de servicio.

Y cuando la aplicación está en segundo plano , se llama a la primera actividad .

Ahora, si usa una actividad splash , debe tener en cuenta que se llamará splashactivity , de lo contrario, si no hay splashActivity, se llamará a cualquiera que sea la primera actividad.

Luego debe verificar getIntent () de la firstActivity para ver si tiene algún paquete. Si todo está bien, verá que el paquete está allí con los valores ingresados. Si el valor en la etiqueta de datos enviada desde el servidor es similar a este,

 "data": { "user_name": "arefin sajib", "value": "user name notification" } 

Luego, en la primera actividad, verá que hay un bash válido ( getIntent () no es nulo ), paquete válido y paquete interno, todo el JSON mencionado anteriormente con datos como clave .

Para este escenario, el código para la extracción de valor se verá así,

  if(getIntent()!=null){ Bundle bundle = getIntent().getExtras(); if (bundle != null) { try { JSONObject object = new JSONObject(bundle.getStringExtra("data")); String user_name = object.optString("user_name"); } catch (JSONException e) { e.printStackTrace(); } } } 

De acuerdo con los documentos: 17 de mayo de 2017

Cuando su aplicación está en segundo plano , Android dirige los mensajes de notificación a la bandeja del sistema. Un usuario toca la notificación abre el iniciador de aplicaciones de forma predeterminada .

Esto incluye mensajes que contienen tanto la carga de datos como la notificación (y todos los mensajes enviados desde la consola de Notificaciones). En estos casos, la notificación se entrega a la bandeja del sistema del dispositivo, y la carga útil de datos se entrega en los extras de la actividad de su iniciador.

Por lo tanto, debe usar los datos de notificación + de carga útil:

 { "to": "FCM registration ID", "notification": { "title" : "title", "body" : "body text", "icon" : "ic_notification" }, "data": { "someData" : "This is some data", "someData2" : "etc" } } 

No es necesario utilizar click_action. Debería obtener exras de la actividad LAUNCHER

      

El código de Java debe estar en el método Crear en MainActivity:

 Intent intent = getIntent(); if (intent != null && intent.getExtras() != null) { Bundle extras = intent.getExtras(); String someData= extras.getString("someData"); String someData2 = extras.getString("someData2"); } 

Puede probar los datos de notificaciones de carga útil + de Firebase Notifications Console . No olvide completar los campos de datos personalizados en la sección Opciones avanzadas

Resumen simple como este

  • si tu aplicación se está ejecutando;

     onMessageReceived() 

es desencadenante

  • si su aplicación no se está ejecutando (eliminada al deslizar);

     onMessageReceived() 

no se dispara y se entrega por orden. Si tiene algún par de clave-valor especialmente. No funcionan porque onMessageReceived () no funciona.

He encontrado de esta manera;

En tu actividad de iniciador, pon esta lógica,

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState, R.layout.activity_splash); if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("PACKAGE_NAME")) { // do what you want // and this for killing app if we dont want to start android.os.Process.killProcess(android.os.Process.myPid()); } else { //continue to app } } 

en este bloque si, busque sus claves de acuerdo con la interfaz de usuario de Firebase.

En este ejemplo mi clave y valor como arriba; (perdón por el idioma =)) enter image description here

Cuando mi código funciona, obtengo “com.rda.note”.

 android.os.Process.killProcess(android.os.Process.myPid()); 

con esta línea de código, cerré mi aplicación y abrí Google Play Market

feliz encoding =)

Elimina la carga de notificación por completo de tu solicitud de servidor. Envíe solo datos y onMessageReceived() en onMessageReceived() ; de lo contrario, su onMessageReceived no se activará cuando la aplicación esté en segundo plano o muerta.

Esto es lo que estoy enviando desde el servidor:

 { "data":{ "id": 1, "missedRequests": 5 "addAnyDataHere": 123 }, "to": "fhiT7evmZk8:APA91bFJq7Tkly4BtLRXdYvqHno2vHCRkzpJT8QZy0TlIGs......" } 

Para que pueda recibir sus datos en onMessageReceived(RemoteMessage message) esta manera: (supongamos que debo obtener el id.)

 Object obj = message.getData().get("id"); if (obj != null) { int id = Integer.valueOf(obj.toString()); } 

Y de manera similar, puede obtener cualquier información que haya enviado desde el servidor dentro de onMessageReceived() .

La forma más sencilla de enviar mensajes, incluso si la aplicación está en segundo plano y en primer plano, de la siguiente manera: – Para enviar un mensaje usando API, puede utilizar una herramienta llamada AdvancedREST Client, es una extensión de Chrome y enviar un mensaje con los siguientes parámetros.

Enlace de herramienta de cliente de reposo: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo

use esta url: – https://fcm.googleapis.com/fcm/send Tipo de contenido: application / json Authorization: key = Su clave de servidor Desde o la clave de Autorización (ver abajo ref)

 { "data": { "image": "https://static.pexels.com/photos/4825/red-love-romantic-flowers.jpg", "message": "Firebase Push Message Using API" "AnotherActivity": "True" }, "to" : "device id Or Device token" } 

La clave de autorización se puede obtener visitando la consola de desarrolladores de Google y haciendo clic en el botón Credenciales en el menú de la izquierda para su proyecto. Entre las claves API enumeradas, la clave del servidor será su clave de autorización.

Y necesita poner tokenID del receptor en la sección “a” de su solicitud POST enviada mediante API.

Gracias a todos por sus respuestas. Pero lo resolví enviando mensajes de datos en lugar de enviar notificaciones . Código del servidor

  'here is a message. message', 'title' => 'This is a title. title', 'subtitle' => 'This is a subtitle. subtitle', 'tickerText' => 'Ticker text here...Ticker text here...Ticker text here', 'vibrate' => 1, 'sound' => 1, 'largeIcon' => 'large_icon', 'smallIcon' => 'small_icon' ); $fields = array ( 'registration_ids' => $registrationIds, 'data' => $msg ); $headers = array ( 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' ); curl_setopt( $ch,CURLOPT_POST, true ); curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers ); curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false ); curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) ); $result = curl_exec($ch ); curl_close( $ch ); echo $result; ?> 

Y atrapó los datos en onMessageReceived

 public class MyFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "MyFirebaseMsgService"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { 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()); sendNotification(remoteMessage.getData().get("message")); } // Check if message contains a notification payload. else if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); sendNotification(remoteMessage.getNotification().getBody()); } } private void sendNotification(String messageBody) { Intent intent = new Intent(this, Notify.class).putExtra("msg",messageBody); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT); String channelId = "idddd"; Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(MyFirebaseMessagingService.this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("FCM Message") .setContentText(messageBody) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); } } 

Junio ​​de 2018 Respuesta –

Debe asegurarse de que no haya una palabra clave de “notificación” en ningún lugar del mensaje. Solo incluya “datos”, y la aplicación podrá manejar el mensaje en onMessageReceived, incluso si está en segundo plano o se eliminó.

Usando las funciones de la nube:

 const message = { token: token_id, // obtain device token id by querying data in firebase data: { title: "my_custom_title", body: "my_custom_body_message" } } return admin.messaging().send(message).then(response => { // handle response }); 

Luego en su onMessageReceived (), en su clase extendiendo com.google.firebase.messaging.FirebaseMessagingService:

 if (data != null) { Log.d(TAG, "data title is: " + data.get("title"); Log.d(TAG, "data body is: " + data.get("body"); } // build notification using the body, title, and whatever else you want. 

Además de las respuestas anteriores, si está probando notificaciones push usando la consola FCM , la clave y el objeto ‘data’ no se agregarán al paquete Push Notification. Por lo tanto, no recibirá una notificación push detallada cuando la aplicación esté en segundo plano o muerta.

En este caso, debe optar por la consola de administración de back-end para probar el escenario de fondo de la aplicación.

Aquí, habrá agregado la clave de ‘datos’ a su paquete de inserción. por lo tanto, la inserción detallada se mostrará como se espera. Espero que esto ayude a pocos.

Experimenté el mismo problema y volví a comstackr la biblioteca de Firebase y no pude enviar notificaciones cuando la aplicación está en segundo plano.

* biblioteca https://github.com/erdalceylan/com-google-firebase-messaging

  dependencies { compile 'com.google.firebase:firebase-core:11.2.0' compile 'com.github.erdalceylan:com-google-firebase-messaging:v1-11.2.0' } 

*

 @WorkerThread public void onMessageReceived(RemoteMessage var1) { //your app is in background or foreground all time calling } 

hope helps. Buena suerte