【问题标题】:onMessageReceived not triggered when app is in foreground应用程序处于前台时未触发 onMessageReceived
【发布时间】:2020-06-20 09:22:39
【问题描述】:

在我的应用中,即使应用在前台,我也想接收 FCM 消息。所以我都按照https://firebase.google.com/docs/cloud-messaging/android/receive#sample-receive设置好了

然而,当我的应用程序在前台时,onMessageReceived 方法未被调用。请注意,当我的应用处于后台时,它会收到通知,因此与 FCM 本身的连接工作正常。

application 我的 AndroidManifest.xml

的一部分

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />

<meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/colorAccent" />

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

MyFirebaseMessagingService.kt

class MyFirebaseMessagingService : FirebaseMessagingService() {
    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        Timber.i("onMessageReceived") // never called
    }
}

我使用 FCM 控制台发送通知。知道我做错了什么吗?为什么我的应用在前台时没有调用onMessageReceived

【问题讨论】:

  • 当我需要这样的行为时,我实现数据消息而不是通知消息。如果这样做,每个应用程序状态中的每个通知都将传递给 onMessageReceived 方法。
  • 这是一种解决方法,但不是解决方案):
  • 我认为提供的解决方法要好得多,因为您将拥有一个处理通知负载的入口点。
  • 你的单一入口点是一件好事。但是我想知道为什么我的示例不起作用,因为我正在关注官方文档。
  • 我用 FCM 实现了一个简单的例子,在我的例子中它可以工作:当我从 Notification Composer 发送通知消息时,在前台按预期调用 onMessageReceived。也许它是由使用 Kotlin 引起的?我用过 Java。

标签: android firebase firebase-cloud-messaging


【解决方案1】:

尝试将清单文件中的服务标签替换为:

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

<service
    android:name=".MyFirebaseInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service>

在 onMessageReceived() 参考这里您可以获得通知/数据有效负载:

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    private static final String TAG = "FCM Service";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        if (remoteMessage.getData().size() > 0) {
            Log.d(TAG, "Message data payload: " + remoteMessage.getData());
        }

        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " +
                    remoteMessage.getNotification().getBody());
        }

    }

}

您可以参考here了解更多信息。

【讨论】:

  • 您从哪里获得“MyFirebaseInstanceIDService”?我从来没有见过这个,你链接的文档中也没有提到它。还是要测试一下。
猜你喜欢
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2017-01-14
  • 2019-07-02
  • 2020-02-10
  • 2017-04-22
相关资源
最近更新 更多