Android通知:未调用onMessageReceived

Android通知:未调用onMessageReceived,android,firebase,push-notification,firebase-cloud-messaging,Android,Firebase,Push Notification,Firebase Cloud Messaging,首先,这不是因为应用程序在后台。 通知与数据消息有效负载一起发送。在游戏控制台中,它显示消息已“确认”,因此它们正在到达设备。对于大多数用户,调用了onMessageReceived方法,但对于少数用户,则不是。为什么会这样 AndroidManifest: <service android:name=".push.MyFirebaseInstanceIDService"> <intent-filter> <action android:na

首先,这不是因为应用程序在后台。

通知与数据消息有效负载一起发送。在游戏控制台中,它显示消息已“确认”,因此它们正在到达设备。对于大多数用户,调用了
onMessageReceived
方法,但对于少数用户,则不是。为什么会这样

AndroidManifest:

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

发生这种情况的主要原因之一是,特定用户在使用应用程序时更改了登录详细信息或使用了不同的帐户。在此特定情况下,特定设备令牌将接收通知,但由于他正在使用不同的帐户,因此不会显示通知。解决此问题的一种方法是在用户每次注销时清除用户的设备令牌,并在用户再次登录时保存新创建的设备令牌。这样,设备令牌将保持更新,用户将收到通知。

这是按预期工作的,通知消息仅在应用程序位于前台时才会发送到onMessageReceived回调。如果您的应用程序处于后台或已关闭,则通知中心会显示一条通知消息,该消息中的任何数据都会传递到用户点击通知后启动的intent

您可以指定单击操作,以指示用户点击通知时应启动的意图。如果未指定单击操作,则使用主活动

当意图启动时,您可以使用它们

getIntent().getExtras();
检索包含随通知消息一起发送的任何数据的集合

第二种方法

重写
FirebaseMessagingService
类中的
HandleContent(意图)
方法

无论应用程序处于前台、后台还是终止状态,每次都会调用
handleIntent()
方法


有关通知消息的更多信息,请参阅。

问题必须与firebase令牌注册有关。您是否已在以下功能中记录令牌生成:

public class TixDoFirebaseIntentService extends FirebaseInstanceIdService {
    @Override
    public void onTokenRefresh() {
        Common.log("FirebaseToken :"+FirebaseInstanceId.getInstance().getToken());
    }
}

可能有这样一种情况,即用户已经安装了应用程序,但尚未打开它,因此不会生成令牌。

您是否在清单文件中使用了以下服务

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

将firebase设置到项目中

如果仍然没有响应,那么可以使用Tomin的第二种方法

已更新:-
现在,您不需要在清单中使用上述服务标记,因为它已被弃用。现在,您可以在FirebaseMessagingService中实现重写方法onNewToken(字符串令牌)并更新令牌。

我有两种解决方案:

1.Upgrade your firebase to version compile com.google.firebase:firebase-messaging:10.2.1
2.Override handleIntent(Intent intent) method in your FirebaseMessagingService class.

无论应用程序处于前台、后台还是终止状态,每次都会调用handleIntent()方法。

当您发送消息时,通常会发生这种情况,而不是发送到特定设备

获取fcm令牌,并将消息发送到“单设备选项”

这是有效的。

文档中的“”状态:

要接收消息,请使用
扩展的
服务

您的服务应该覆盖
onMessageReceived
onDeletedMessages
回调

它应该在收到消息后10秒内处理任何消息。之后,Android不保证执行,并且可以随时终止您的进程

如果您的应用程序需要更多时间来处理消息,请使用

onMessageReceived
的实现应该对执行时间进行基准测试,并与调度程序一起调度a,如果执行时间超过10秒(在某些情况下)。for Override
onMessageReceived
甚至会显示类似的内容

始终分派作业通常会解决相关进程终止的可能性,而不管它可能需要多长时间才能返回。
onMessageReceived
很可能被调用,但被终止。

我想您已经向服务器注册了
firebase
令牌?@AbdulKawee是的。消息到达设备,并在播放控制台中显示“已确认”。您是否检查了在这种情况下是否同时从服务器发送通知和数据负载?@Debdeep I发送数据负载,以便调用onMessageReceived方法。是的,我会检查它是否已发送。要在系统托盘中获取通知和数据意图,您需要同时发送它们。请检查此链接-什么?如果设备正在接收通知,为什么不调用onMessageReceived?只要调用onTokenRefresh,就会保存令牌。我仍然对您的答案感到困惑。“帐户”和“登录详细信息”是什么意思?首先,我有所有这些的日志,这些用户没有注销,但我不知道这会如何影响Firebase令牌或显示的通知。如果令牌发生变化,这与我的应用程序无关,并且会调用onTokenRefresh,对吗?无论何时调用onTokenRefresh,我的应用程序都会向上发送新令牌。我有每次我的应用程序发送此令牌的日志,我可以清楚地看到它发生在发送通知后的一两天内,但onMessageReceived没有调用我们。我在问题开始时用粗体文字说,这不是因为应用程序在后台,而你忽略了这一点。这是一个数据负载,如果应用程序在后台,则会调用该方法,只是不是针对每个设备。不,不是。代币被注册并使用得非常好。问题是通知到达了设备,但没有调用onMessageReceived方法,就像我的问题所说的。在这种情况下,通知没有到达?当应用程序打开或关闭时,当您以无格式发送数据时,会出现这种情况
1.Upgrade your firebase to version compile com.google.firebase:firebase-messaging:10.2.1
2.Override handleIntent(Intent intent) method in your FirebaseMessagingService class.