FCM消息的官方文档:
https://firebase.google.com/docs/cloud-messaging/concept-options
https://firebase.google.cn/docs/cloud-messaging/concept-options(中文镜像网址)
简单来说,FCM 消息有两种类型,一种是Notification消息,消息的Json格式中有notification包裹(仅有notification!!):
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
}
另一种是Data消息,消息的Json格式中有notification包裹:
"data":{
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
}
如果消息格式中notification字段和data字段并存,那么这个消息被划归为一个Notification消息。值得注意的是:如果Json中只有一个data{}包裹,但是里面有个字段名叫 “gcm.notification.XXX”,那么这个消息即使没有notification字段,也会被划归为一个Notification消息。
上面先写消息类型的原因,是因为FirebaseMessagingService子类中的onMessageReceived这个接收函数的执行时机,跟消息的类型息息相关。下文结论中的MyFirebaseMessagingService是FirebaseMessagingService的子类,很神奇的一点是,如果用了FCM会发现,即使APP没运行把APP给杀掉了,这时候如果收到了FCM通知,APP里的MyFirebaseMessagingService里面的onMessageReceived回调也会被调用执行!!!!这个Service在APP被杀掉以后,还是由系统级别去保活的(当然如果手机锁屏休眠进入低电耗模式Doze的话,这个回调就不会被执行了)。在下面用PushTry这个测试网址(