La notificación de inserción funciona incorrectamente cuando la aplicación está en segundo plano o no se está ejecutando

Estoy usando Firebase Cloud Messaging para enviar notificaciones automáticas.

Aquí está mi FirebaseMessageService :

 public class FireBaseMessageService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { Log.e("TAG", "From: " + remoteMessage.getFrom()); Log.e("TAG", "Notification Message Body: " + remoteMessage.getData().get("CardName")+" : "+remoteMessage.getData().get("CardCode")); sendNotification(remoteMessage.getNotification().getBody()); } private void sendNotification(String messageBody) { Intent intent = new Intent(this, StartActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher_final) .setContentTitle("Notification") .setContentText(messageBody) .setTicker("Test") .setAutoCancel(true) .setDefaults(Notification.DEFAULT_SOUND) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); } } 

Y FirebaseInstanceServer :

 public class FirebaseInstanceService extends FirebaseInstanceIdService { @Override public void onTokenRefresh() { // Get updated InstanceID token. String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.e("TAG", "Refreshed token: " + refreshedToken); // TODO: Implement this method to send any registration to your app's servers. sendRegistrationToServer(refreshedToken); } private void sendRegistrationToServer(String token) { // Add custom implementation, as needed. Log.e("TAG", "Refreshed token2: " + token); } } 

Que se declara en el AndroidManifest :

           

El problema es que cuando se ejecuta la aplicación, el ticker se muestra bien y la notificación viene con el sonido predeterminado, pero cuando la aplicación está en primer plano o no se está ejecutando, la notificación aparece sin sonido y el ticker no se muestra en la barra de estado.
¿Por qué está sucediendo esto y cómo puedo solucionarlo?

Con FCM, especifique una carga POST para enviar a https://fcm.googleapis.com/fcm/send . En esa carga útil puede especificar un data o una clave de notification , o ambos.

Si su carga contiene solo una clave de data , su aplicación se encargará de todos los mensajes push. Por ejemplo, todos se entregan a su controlador onMessageReceived .

Si su carga contiene una clave de notification , su aplicación manejará los mensajes de inserción solo si su aplicación está activa / en primer plano. Si no lo está (por lo tanto, está en segundo plano o cerrado por completo), FCM maneja mostrando la notificación por usted utilizando los valores que coloca en la carga de la clave de notification .

Tenga en cuenta que las notificaciones enviadas desde una consola (como la consola de Firebase) siempre incluyen una clave de notification .

Parece que desea manejar los mensajes de FCM usted mismo para que pueda personalizar la notificación un poco más, etc., por lo que sería mejor no incluir la clave de notification en la carga de POST, de modo que todos los mensajes de inserción se entregan a su onMessageReceived .

Puedes leer más sobre esto aquí:
Opciones de mensajes avanzados
Sintaxis del mensaje en sentido descendente

Pasé 2 semanas para entender por qué mi aplicación ya no puede recibir mensajes de datos cuando está en segundo plano y, por extraño que parezca, ¡llegué a la conclusión de que Android-Studio 2.1.2 es el problema!

Ya no puedo recibir ningún mensaje de FCM en la aplicación de fondo

https://github.com/firebase/quickstart-android/issues/89