首先,这不是因为应用程序在后台。
通知与数据消息有效负载一起发送。在Play控制台中,它表示消息是“已确认”,因此它们已到达设备。对于大多数用户,调用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>
MyFirebaseMessagingService:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
...
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
...
}
答案 0 :(得分:3)
可能发生这种情况的主要原因之一是因为特定用户更改了他的登录详细信息或在使用该应用时使用了其他帐户。在这种特定情况下,特定设备令牌将接收通知,但由于他正在使用不同的帐户,因此不显示通知。解决此问题的一种方法是在用户每次登录时清除用户的设备令牌,并在用户再次登录时保存新创建的令牌。这样,设备令牌将保持更新,用户将收到通知。
答案 1 :(得分:2)
这是按预期工作的,只有当您的应用位于前台时,通知消息才会传递到您的onMessageReceived回调。如果您的应用处于后台或已关闭,则通知中心会显示通知消息,并且该消息中的任何数据都会传递给因用户点击该消息而启动的意图通知。
您可以指定click_action以指示在用户点击通知时应启动的意图。如果未指定click_action,则使用主要活动。
启动意图后,您可以使用它们
getIntent().getExtras();
检索包含与通知消息一起发送的任何数据的Set。
第二种方法
覆盖handleIntent(Intent intent)
课程中的FirebaseMessagingService
方法。
handleIntent()
方法。
有关通知消息的更多信息,请参阅docs。
答案 2 :(得分:1)
问题必须与firebase令牌注册有关。您是否在以下函数中记录了令牌生成:
public class TixDoFirebaseIntentService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
Common.log("FirebaseToken :"+FirebaseInstanceId.getInstance().getToken());
}
}
可能存在用户已安装应用但尚未打开它的情况,因此导致无法生成令牌。
答案 3 :(得分:1)
您是否在清单文件中使用了以下服务?
<service android:name="push_notification.service.FirebaseIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
如果没有,那么使用它创建一个FirebaseIDService,扩展FirebaseInstanceIdService实现其方法。 如果它仍然无法正常工作,那么设置有问题请按https://www.survivingwithandroid.com/2016/09/android-firebase-push-notification.html将firebase设置到您的项目中。
如果仍然没有回应,那么你可以使用Tomin的第二种方法。
答案 4 :(得分:1)
我有两个解决方案:
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()方法,无论app是处于前景,后台还是被杀死状态。
答案 5 :(得分:1)
当您通常发送消息而不是特定设备时会发生这种情况
获取fcm令牌,并将消息发送到“Single Device”选项。
这很有效。
答案 6 :(得分:1)
“Handling Messages”状态的文档:
要接收消息,请使用
service
FirebaseMessagingService的extends
。您的服务应覆盖
onMessageReceived
和onDeletedMessages
回调。应在收到后10秒内处理任何邮件。之后,Android 不保证执行,可以随时终止您的流程。
如果您的应用需要更多时间来处理消息,请使用Firebase Job Dispatcher。
onMessageReceived
的实现应该对执行时间进行基准测试,并从Job向调度程序发送RemoteMessage - 以防执行时间超过10秒(在某些情况下) )。覆盖onMessageReceived
的{{3}}甚至表明它是相似的。
总是调度工作通常可以解决相关流程终止的可能性,无论返回多长时间。
onMessageReceived
很可能 被调用,但已被终止。