如何做漂亮的网站,wordpress 编辑文章,做网站需要注意的,四川seo技术培训FirebaseMessagingService 是 Firebase Cloud Messaging (FCM) 提供的一个服务#xff0c;用于处理来自 Firebase 服务器的消息。它有几个关键的方法#xff0c;你提到的 onMessageReceived、doRemoteMessage 和 handleIntent 各有不同的用途。下面逐一解释这些方法的作用和用…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.RemoteMessageclass MyFirebaseMessagingService : FirebaseMessagingService() {override fun onMessageReceived(remoteMessage: RemoteMessage) {super.onMessageReceived(remoteMessage)// 获取消息标题和内容消息负载val title remoteMessage.notification?.title ?: Default Titleval messageBody remoteMessage.notification?.body ?: Default Message Body// 获取数据数据负载val data remoteMessage.dataval deeplink data[deeplink] // 假定有一个键为deeplink的数据// 展示通知sendNotification(title, messageBody, deeplink ?: default_deeplink)}private fun sendNotification(title: String, messageBody: String, deeplink: String) {val channelId YOUR_CHANNEL_IDcreateNotificationChannel()val builder NotificationCompat.Builder(this, channelId).setSmallIcon(R.drawable.ic_launcher_foreground) // 更改为你的通知图标.setContentTitle(title).setContentText(messageBody).setPriority(NotificationCompat.PRIORITY_DEFAULT)with(NotificationManagerCompat.from(this)) {// notificationId 是定义通知的唯一 int 值notify(System.currentTimeMillis().toInt(), builder.build())}// 处理 deeplink 或是其他额外的逻辑...}// Android 8.0 及以上需要创建通知频道private fun createNotificationChannel() {if (Build.VERSION.SDK_INT Build.VERSION_CODES.O) {val name Channel Nameval descriptionText Channel Descriptionval importance NotificationManager.IMPORTANCE_DEFAULTval channel NotificationChannel(YOUR_CHANNEL_ID, name, importance).apply {description descriptionText}val notificationManager: NotificationManager getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManagernotificationManager.createNotificationChannel(channel)}}
}请注意您需要修改 R.drawable.ic_launcher_foreground 到您实际的通知图标资源同时 YOUR_CHANNEL_ID 应该替换为您应用中的实际通知频道 ID。
通过上述代码当 FCM 消息到达时无论应用在前台、后台还是被杀死onMessageReceived 都将触发前提是符合数据消息的接收条件您可以获取消息中的标题、消息体和附加的数据如 deeplink然后根据这些信息展示一条自定义通知。
在使用 Firebase Cloud Messaging (FCM) 时您的应用可以接收两种类型的消息通知消息 和 数据消息。处理这些消息的方式与应用的前台/后台状态有关以及消息的类型。
onMessageReceived 方法
onMessageReceived 方法在以下情况下被调用
应用在前台时不论消息类型。应用在后台或被杀死时仅当消息是数据消息或通知和数据的混合消息在这种情况下数据部分被送达。
处理后台消息
当您的应用处于后台或被杀死状态时如果是纯通知消息FCM 会自动展示通知无需编写额外的接收代码。此外点击通知可以自动打开应用或启动指定的活动Activity您可以在消息中指定 click_action 字段来指定要启动的活动并在该活动中处理深链接。
实现深链接的点击响应
为了在点击通知后执行消息中携带的深链接您可以
在发送的消息中设定通知消息的 click_action 属性并为其指定一个唯一的值。在应用的 AndroidManifest.xml 中给相应的活动Activity配置一个 Intent Filter该 Intent Filter 捕捉上一步中定义的 click_action。
例如您的消息结构可能如下所示
{to : FCM_TOKEN,notification : {body : 消息正文,title: 消息标题,click_action:OPEN_ACTIVITY_1},data : {extra_info : some_extra_information,deep_link : yourapp://deeplink/path}
}然后在 AndroidManifest.xml 中配置捕捉这个动作的活动
activityandroid:name.YourActivityintent-filteraction android:nameOPEN_ACTIVITY_1 /category android:nameandroid.intent.category.DEFAULT //intent-filter
/activity在 YourActivity 中您可以获取数据并处理深链接
if (intent.extras ! null) {val deepLink intent.extras.getString(deep_link)// 根据 deepLink 进行导航或其他操作
}注意
当您的应用在后台或被杀死时接收通知消息并且您希望在用户点击通知时执行一些代码如处理深链接时上述方法一般可以实现目的。但是如果需要在应用在后台或被杀死时收到的数据消息也能展示通知并在点击时执行相应深链接您需要在 onMessageReceived 方法中手动构建并展示通知并处理点击事件。这一点非常重要因为在后台时数据消息不会自动展示通知必须手动实现。
综上您不需要也不应该直接修改 handleIntent 方法来处理普通的 FCM 消息。相反您应专注于根据消息的类型和应用的状态合理地使用 onMessageReceived 并处理通知的创建与点击响应。
在 Android 中如果你想在收到 Firebase Cloud Messaging (FCM) 消息后展示自定义样式的通知你可以在 onMessageReceived 方法中创建并展示一个通知。这给了你完全的控制权允许你自定义通知的外观和行为。
以下是创建并展示一个自定义样式通知的基本步骤
步骤 1: 创建 Notification Channel仅限 Android Oreo (API 26) 及以上版本
为了确保通知在 Android Oreo 及以上版本中正常工作你需要创建一个 Notification Channel。
if (Build.VERSION.SDK_INT Build.VERSION_CODES.O) {val channelName YourChannelNameval channelDescription YourChannelDescriptionval channelId YourChannelIdval importance NotificationManager.IMPORTANCE_DEFAULTval channel NotificationChannel(channelId, channelName, importance).apply {description channelDescription}// 注册通道val notificationManager: NotificationManager getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManagernotificationManager.createNotificationChannel(channel)
}步骤 2: 创建自定义样式的通知
你可以使用 NotificationCompat.Builder 并利用其提供的样式如 BigTextStyle, InboxStyle, BigPictureStyle 等来定制通知的视觉样式。
val builder NotificationCompat.Builder(this, channelId) // 使用创建的通道ID.setSmallIcon(R.drawable.ic_notification) // 设置小图标.setContentTitle(Example Title) // 设置通知标题.setContentText(Example Description) // 设置通知内容.setPriority(NotificationCompat.PRIORITY_DEFAULT) // 设置优先级// 添加自定义样式.setStyle(NotificationCompat.BigTextStyle().bigText(Here is a longer text!))// 构建 PendingIntent 来处理点击事件例如打开 Activity
val intent Intent(this, YourActivity::class.java).apply {flags Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
val pendingIntent: PendingIntent PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)builder.setContentIntent(pendingIntent)
builder.setAutoCancel(true) // 点击通知后自动消失这里YourActivity::class.java 应该替换为你想要打开的 Activity 的实际类名。
步骤 3: 展示通知
最后使用 NotificationManager 来展示你刚才创建的通知。不要忘记替换通知的 IDnotificationId如果你想要展示多个通知每个通知的 ID 都应该是独一无二的。
with(NotificationManagerCompat.from(this)) {// notificationId 是定义通知的唯一 int 值notify(notificationId, builder.build())
}将以上步骤放在 onMessageReceived 方法内这样每当你的应用接收到 FCM 消息时都会展示一个定制化的通知。如果消息带有数据负载你还可以根据这些数据来定制通知的内容和样式。
请注意如果用户已经关闭了你的应用的通知权限或者当前设备上的系统设置禁止了通知那么这些通知将不会展示。因此确保在应用中妥善地处理通知权限请求和指导用户如何在系统设置中启用通知。
如果您在处理 Firebase Cloud Messaging (FCM) 消息时正确配置了通常不会出现两条通知的情况。这里是出现冲突可能情况的一些分析和建议
1. FCM 通知类型
FCM 允许发送两种类型的消息
通知消息当应用在后台时消息会自动被 FCM 处理显示为系统通知。如果应用在前台onMessageReceived 会被调用您有机会处理这个通知。数据消息无论应用处于前台还是后台onMessageReceived 都会被调用您需要自己编写代码来生成并显示通知。
2. 消息处理
当您的应用处于前台并且收到了一个通知消息您可以在 onMessageReceived 方法内自定义如何处理这个通知包括展示自定义通知。当应用处于后台并且收到了一个通知消息系统会自动处理这个通知展示一个系统通知。这种情况下onMessageReceived 不会被调用。当应用处于前台或后台并且收到了一个数据消息onMessageReceived 会被调用您可以在其中处理数据并决定是否展示通知。
3. 避免冲突
如果您在前台手动处理并展示通知同时您的消息是一个通知消息可能会出现两个通知一个是 FCM 自动创建的一个是您自己创建的。为避免这种情况有两种方法
使用数据消息确保发送的是数据消息而非通知消息。这样无论应用处于前台还是后台onMessageReceived 都会被调用而不会生成自动的系统通知您可以在接收到消息时自由地处理并展示您自己的通知。合理设计通知显示逻辑如果您需要发送通知消息例如确保后台应用也能接收则可以在 onMessageReceived 里加入逻辑仅在应用处于前台时展示自定义通知。这样当应用处于后台时只有 FCM 生成的系统通知会被展示当应用处于前台时则根据您在 onMessageReceived 中的逻辑展示自定义通知。
总结
正确地选择和处理消息类型可以避免同时出现两条通知的问题。如果您完全控制通知的显示逻辑尤其是选择数据消息就可以按照自己的需求来设计通知的展示而不会出现冲突。
重写 handleIntent(Intent intent) 方法来处理来自 Firebase Cloud Messaging (FCM) 的消息并不是官方推荐的方法且很可能不解决您提出的问题。在 Firebase 的旧版本里有些开发者通过重写 handleIntent 方法来在应用处于后台时截获和修改消息。然而这种做法存在几个问题 维护性和兼容性直接重写基础服务的方法如 handleIntent可能导致在未来的库更新中出现兼容性问题。Firebase 和 Android 平台都在不断进化直接依赖于这些内部实现的细节可能导致您的应用在未来某个时间点突然出现问题。 违背设计初衷Firebase Messaging 设计的初衷是简化推送通知的处理。它区分了「通知消息」和「数据消息」并为这两种类型的消息提供了不同的处理路径。通过恰当地使用这两种消息类型您应该能够满足大部分的需求而无需通过重写底层方法来实现特定的行为。
解决方案
如果您的目标是确保即使在应用处于后台或被杀死状态下也能按照自定义方式处理通知您应该使用数据消息。发送数据消息而非通知消息让您有机会在应用的 onMessageReceived 方法中捕获所有消息并自定义如何处理这些消息和通知无论应用处于前台还是后台。
当应用在后台或被杀死时收到数据消息您可以在 onMessageReceived 方法中创建并显示自定义通知这时可以使用 Android 的标准通知构建方法来自定义通知的展示。
确保在您的消息发送逻辑中使用了数据消息。例如
{to: device_token_or_topic,data: {key1: value1,key2: value2,// 更多自定义的键值对}
}在 Android 客户端您的 FirebaseMessagingService 的 onMessageReceived 方法将接收到这些消息即使在应用被杀死的情况下也是如此
override fun onMessageReceived(remoteMessage: RemoteMessage) {// Handle data payloadif (remoteMessage.data.isNotEmpty()) {val myData remoteMessage.data[key1] // 例子// 根据接收到的数据处理逻辑// 比如生成自定义通知}
}通过这种方式您可以完全控制通知的生成和展示逻辑而不需要依赖于 Firebase 自动处理通知的机制这样就不会产生重复的通知也避免了需要重写 handleIntent 方法的需求。