FirebaseMessagingService
是 Firebase Cloud Messaging (FCM) 提供的一个服务,用于处理来自 Firebase 服务器的消息。它有几个关键的方法,你提到的 onMessageReceived
、doRemoteMessage
和 handleIntent
各有不同的用途。下面逐一解释这些方法的作用和用法:
1. onMessageReceived(RemoteMessage message)
当你的应用处于前台时,如果有消息到达,就会回调 onMessageReceived
方法。这里是处理接收到的消息的逻辑部分。
override fun onMessageReceived(message: RemoteMessage) {
super.onMessageReceived(message)
// 你可以根据消息(message)的内容来做相应的处理,
// 比如展示通知,更新UI等。
}
2. doRemoteMessage()
在 FirebaseMessagingService
的官方文档中,并没有直接提及 doRemoteMessage
这个方法。它可能是某个特定项目或库中特有的方法,而不是 Firebase SDK 的一部分。如果它存在于你的代码或你使用的某个库中,可能需要查找特定的文档或源代码来了解其具体用途。
3. handleIntent(Intent intent)
handleIntent
方法在服务中处理意图(Intent)。它不是 FirebaseMessagingService
专有的方法,而是 Android Service
类的一部分,可能会在接收到 Intent 时被调用。然而,在处理 FCM 相关的任务中,你通常不需要直接覆写或调用 handleIntent
方法。FCM 服务通常会自动处理消息的接收和分发工作,包括将消息派发到 onMessageReceived
方法。
如果你需要在后台接收消息并触发一些行为,通常会使用 onMessageReceived
来实现逻辑,因为 FCM 为这种用例提供了足够的支持。
注意:如果你的应用在后台,Firebase 通常会自动处理消息。如果消息中包含了通知负载,系统可能会自动显示通知,而不会调用 onMessageReceived
。如果想要确保后台消息也触发 onMessageReceived
,需要在发送消息时仅使用数据负载(即不包含通知负载),并确保应用实现了适当的后台运行条件(例如,使用高版本的 targetSdkVersion,考虑到 Android 的后台执行限制等)。
总之,对于绝大多数使用 Firebase Cloud Messaging 的场景,你主要会与 onMessageReceived
方法打交道,对于特殊的或自定义的方法(如 doRemoteMessage
),需要参考特定的文档或代码实现。
当你使用 Firebase Cloud Messaging (FCM) 发送消息时,消息可以包含两种类型的数据:
- 通知负载:当应用在前台运行时,通过
onMessageReceived
处理;当应用在后台或被杀死时,系统会自动处理。 - 数据负载:无论应用是在前台、后台还是被杀死,都会触发
onMessageReceived
(需要特定格式的负载才会在后台触发)。
以下是如何在 FirebaseMessagingService
的 onMessageReceived
方法中获取消息标题、消息体和任意附加的数据(如 deeplink)的一个示例:
完整的 FirebaseMessagingService 示例
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.os.Build
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onMessageReceived(remoteMessage: RemoteMessage) {
super.onMessageReceived(remoteMessage)
// 获取消息标题和内容(消息负载)
val title = remoteMessage.notification?.title ?: "Default Title"
val messageBody = remoteMessage.notification?.body ?: "Default Message Body"
// 获取数据(数据负载)
val data = remoteMessage.data
val deeplink = data["deeplink"] // 假定有一个键为"deeplink"的数据