Firebase在应用程序不活动时不调用onMessageReceived方法。
Firebase在应用程序不活动时不调用onMessageReceived方法。
我正在Android上使用Firebase Cloud Messaging。
- 当应用程序在前台时,我可以成功接收到通知和数据消息。
- 文档中指出,如果在应用程序处于后台时收到通知消息,则Firebase将代表应用程序将通知发送到系统托盘。但这对我来说不起作用。
- 如果发送了数据消息并且应用程序处于后台,则成功调用onMessageReceived方法。
- 最令人困扰的情况是,当我强制停止应用程序然后尝试发送通知或数据消息时,在此情况下onMessageReceived方法不会被调用。
- 我看过一些关于后台使用情况的文章,但我还没有看到任何关于完全停止应用程序时为什么没有接收到消息的解释。
我在清单文件中有以下内容:
文档对于扩展FirebaseMessagingService有以下说明:
如果您想在后台应用程序上做一些消息处理以外的操作,则需要这个。
他们对于“在后台应用程序上做消息处理以外的操作”并不是很清楚。我只能假设他们指的是在应用程序关闭时处理消息。
非常感谢任何帮助。
Firebase onMessageReceived not called when app is inactive
问题出现的原因:
问题出现在后端。当消息中包含notification
对象时,只有在应用程序处于前台时才会调用onMessageReceived。因此,您只能使用data
对象。
解决方法:
只使用data
对象。例如:
var message = { to: user.deviceId, // required collapse_key: 'key', data: { title: 'Hello', body: 'Body' } };
这适用于所有情况。
如果我们这样做,即使在设备上的应用程序被强制停止,我们仍然可以收到通知吗?
@ Vallilis 我不认为这是解决方案。我一直在测试使用以下数据消息:
curl --header "Authorization: key=$firebase_token" --header "Content-Type:application/json" fcm.googleapis.com/fcm/send -d "{\"to\": \"device_token\",\"data\": {\"message\":\"A data message\"}}"
如果我在应用程序设置中强制停止应用程序然后尝试发送消息,什么也不会出现。我还使用WhatsApp测试了相同的场景。如果您强制停止WhatsApp,则不会出现任何消息通知。这使我相信Google Play服务实际上没有启动服务。
这种方法在重启后不起作用,但在应用程序在后台运行并且您想要获取数据键/值而不是通知标题和正文时起作用。
出现问题的原因是当应用程序处于非活动状态时,Firebase的onMessageReceived方法不会被调用。这是因为通过强制停止应用程序,关闭了与应用程序相关的所有后台进程,导致无法接收到通知。
解决方法如下:
1. 在AndroidManifest.xml文件中,确保已正确配置FirebaseMessagingService。确保以下内容已添加到
2. 在MyFirebaseMessagingService类中,确保已正确重写onMessageReceived方法。在该方法中处理接收到的消息。示例代码如下:
public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { // 处理接收到的消息 if (remoteMessage.getData().size() > 0) { // 处理数据消息 String message = remoteMessage.getData().get("message"); // 处理其他数据 } // 处理通知消息 if (remoteMessage.getNotification() != null) { String title = remoteMessage.getNotification().getTitle(); String body = remoteMessage.getNotification().getBody(); // 处理通知内容 } } }
3. 确保应用程序处于活动状态时,不要强制停止应用程序。否则,将无法接收到通知。
通过以上步骤,可以解决Firebase的onMessageReceived方法在应用程序非活动状态下不被调用的问题。