当我的应用程序前台服务被终止时,不会收到FCM通知,更清楚的是,我正试图让我的应用程序始终在后台运行,我使用前台服务来实现这一点,有时应用程序未被ANDROID系统终止,前台通知会出现15个多小时,但其他情况下,当我的前台通知被终止,并且我发送FCM通知时,它在1小时或更短时间内被终止,而我的设备没有收到FCM通知!!这里有什么问题!我怎样才能解决它!
在前台处理通知
当应用程序关闭时,您的通知将由Google服务流程处理,该流程负责根据需要显示您的通知,包括默认的单击操作(打开应用程序)和通知图标。
当应用程序处于前台时,接收到的消息由应用程序处理,由于没有处理它的逻辑,所以什么都不会发生!
要解决这个问题,我们需要自己的FirebaseMessagingService
,让我们创建一个。创建一个扩展它的新类并实现onMessageReceived
方法。然后从remoteMessage
获取通知对象,并创建自己的Android通知。
public class NotificationService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle(remoteMessage.getNotification().getTitle())
.setContentText(remoteMessage.getNotification().getBody())
.setSmallIcon(R.mipmap.ic_launcher)
.build();
NotificationManagerCompat manager = NotificationManagerCompat.from(getApplicationContext());
manager.notify(123, notification);
}
}
然后将服务添加到您的Androidanifest.xml
<service android:name=”.NotificationService”>
<intent-filter>
<action android:name=”com.google.firebase.MESSAGING_EVENT”/>
</intent-filter>
</service>
现在,如果您再试一次,您将在应用程序处于前台时显示通知!
在现实生活中,你的onMessageRec的
内容会稍微复杂一点,你会想要不同的智能操作,这取决于通知的类型,你会想要显示一个更好的大图标(出现在通知正文上的图标),并且一定要更改状态栏图标。
你现在遇到的问题是,你的onMessageReceived
仅在应用程序位于前台时调用,如果你的应用程序位于后台,谷歌服务将负责显示你的消息。
解决方案是什么?不要使用“通知”消息负载,而是使用“数据”。使用数据
解决这个前台/后台问题的最后一步是从消息负载中删除通知对象。
而不是发送:
{
"to": "the device token"
"notification":{
"title":"New Notification!",
"body":"Test"
},
"priority":10
}
Send:
{
"to": "the device token"
"data":{
"title":"New Notification!",
"body":"Test"
},
"priority":10
}
这样,您的通知将始终由应用程序、通知服务处理,而不是由谷歌服务流程处理。
您还需要更改代码以处理数据负载:
// Old Way
//.setContentTitle(remoteMessage.getNotification().get(“title”))
//.setContentText(remoteMessage.getNotification().get(“body”))
// New Way
.setContentTitle(remoteMessage.getData().get(“title”))
.setContentText(remoteMessage.getData().get(“body”))
您的整个通知服务现在将如下所示:
public class NotificationService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle(remoteMessage.getData().get(“title”))
.setContentText(remoteMessage.getData().get(“body”))
.setSmallIcon(R.mipmap.ic_launcher)
.build();
NotificationManagerCompat manager = NotificationManagerCompat.from(getApplicationContext());
manager.notify(123, notification);
}
}
使用数据而不是通知对象的另一个优点是,您可以在“数据”对象中放入任何需要的内容。例如,用户ID、图像的URL……您可能希望用于生成通知或传递给单击操作的任何信息。请注意,所有将被视为字符串。例如
"data":{
"title":"New Notification!",
"body":"Test",
"user_id": "1234",
"avatar_url": "http://www.example.com/avatar.jpg"
},
本文档的“处理消息”部分也解释了这种差异:https://firebase.google.com/docs/cloud-messaging/android/receive
结论
请注意,如果您将“通知”对象保留在有效载荷中,它将像以前一样运行。你需要摆脱“通知”,只提供“数据”对象。
我正在将通知从GCM迁移到FCM。在GCM中,当应用程序处于前台、后台或被杀死时,我能够收到通知,但在FCM中,当应用程序未被打开或被刷出时,我无法收到通知。我错过什么了吗???? } json请求正文:
即使应用程序从后台被杀死或从内存中被刷出,我如何接收到设备的fcm通知。我使用维梧、Oppo、松下设备。但在应用程序被终止时未收到通知。
当应用程序在前台时不接收推送通知,但当应用程序在后台时接收我已遵循来自https://medium . com/@ ankushaggarwal/GCM-setup-for-Android-push-notifications-656 cf DD 8 adbd的FCM教程
我正在处理FCM通知。当应用程序在后台时,我的通知工作正常,但当应用程序在前台时,我的通知无法接收。我几乎什么都试过了,但都不奏效。当应用程序处于前台时,不会收到通知。 manifest.xml: 代码(FirebaseMessagingService):
我使用Firebase控制台发送通知到我的Android设备,它的工作正常时,应用程序是在后台或前台状态。但它没有收到的通知在被杀死的状态,因为我没有附加任何数据,它不应该是一个数据通知。
我使用firebase推送通知到设备令牌。当应用程序打开或前景我可以得到通知很好。但当当前任务的应用程序被杀死或清除应用程序时,我无法收到通知发送。 我试过OnMessageReceedEardy的第一次工作。但现在它不工作时,杀死的应用程序。 > 代码接收通知: