推送通知在应用程序处于后台或未运行时工作不正确

我正在使用Firebase云消息传递发送推送通知。

这是我的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()); } } 

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

AndroidManifest声明的是:

 <service android:name=".util.notifications.FireBaseMessageService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> <service android:name=".util.notifications.FirebaseInstanceService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service> 

所以问题是,当应用程序正在运行ticker显示很好,通知来默认声音,但是当应用程序在前台或没有运行通知来没有任何声音和ticker不显示在状态栏。
为什么会发生这种情况,我该如何解决?

通过FCM,您可以指定发送到https://fcm.googleapis.com/fcm/send的POST有效负载。 在该有效负载中,您可以指定datanotification密钥,或者同时指定两者。

如果你的载荷只包含一个data键,你的应用程序将自己处理所有的推送消息。 例如,它们都被传递给你的onMessageReceived处理程序。

如果您的有效载荷包含notification密钥,则只有当您的应用程序处于活动状态/在前台时,您的应用程序才会自行处理推送消息。 如果不是(所以它在后台,或完全closures),FCM处理通过使用您放入notification密钥载荷的值来显示notification

请注意,从控制台发送的通知(如Firebase控制台)通常包含notification密钥。

看起来你想自己处理FCM消息,所以你可以定制通知多一点等,所以最好不要在POST有效载荷中包含notification密钥,所以所有的推送消息都会传递给你的onMessageReceived

你可以在这里阅读更多
高级消息选项
下游消息语法

我花了2个星期的时间来理解为什么我的应用程序不能在后台收到数据信息,而且很奇怪,我得出了Android-Studio 2.1.2的问题!

在后台应用程序中,我不能收到任何FCM消息

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