0Pricing
Android Academy · 课时

使用 Cloud Messaging 推送

发送和接收 FCM 通知

使用 Cloud Messaging 推送 是 CoddyKit 上的免费 Android Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。

什么是 Cloud Messaging?

Firebase Cloud Messaging (FCM) 会向您的应用发送推送通知和数据消息 — 即使应用已关闭也可以发送。

流程很简单:

  • 每次安装应用都会获得一个唯一的注册令牌。
  • 您的服务器(或 Firebase 控制台)会将消息发送到该令牌(或某个主题)。
  • FCM 会将消息路由到设备,由设备显示或处理。

添加 Messaging 依赖项

FCM 包含在 firebase-messaging 库中,其版本由您之前设置的 BoM 统一管理。

存在 BoM 时,不需要指定版本号。

// app/build.gradle.kts
dependencies {
    implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
    implementation("com.google.firebase:firebase-messaging")
}

通知权限

在 Android 13 (API 33) 及更高版本中,发布通知需要运行时权限 POST_NOTIFICATIONS。

请在清单文件中声明该权限,然后在运行时请求 — 如果用户未授予权限,您的通知会被静默丢弃。

<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

请求权限

使用 Activity Result API 在运行时请求 POST_NOTIFICATIONS。仅在 API 33 及更高版本上请求;旧版本会隐式授予该权限。

import android.Manifest
import android.os.Build
import androidx.activity.result.contract.ActivityResultContracts

val requestPermission = registerForActivityResult(
    ActivityResultContracts.RequestPermission()
) { granted ->
    println(if (granted) "Notifications allowed" else "Notifications denied")
}

fun askNotificationPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        requestPermission.launch(Manifest.permission.POST_NOTIFICATIONS)
    }
}

注册令牌

每次安装都有一个唯一的FCM 令牌,用于标识该安装对应的目标设备。使用 Firebase.messaging.token 获取它。

将此令牌发送到您的后端,以便后端向指定设备推送消息。令牌可能会发生变化,因此请始终以最新令牌为准。

import com.google.firebase.Firebase
import com.google.firebase.messaging.messaging
import kotlinx.coroutines.tasks.await

suspend fun currentToken(): String {
    return Firebase.messaging.token.await()
}

Messaging 服务

要接收消息,请继承 FirebaseMessagingService。重写 onMessageReceived 以处理收到的有效负载,并重写 onNewToken 以响应令牌轮换。

使用 FCM 意图筛选器在清单文件中注册该服务。

import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage

class MyFcmService : FirebaseMessagingService() {

    override fun onNewToken(token: String) {
        // Upload the fresh token to your backend
        sendTokenToServer(token)
    }

    override fun onMessageReceived(message: RemoteMessage) {
        val title = message.notification?.title ?: "New message"
        val body = message.notification?.body ?: ""
        showNotification(title, body)
    }

    private fun sendTokenToServer(token: String) { /* ... */ }
    private fun showNotification(title: String, body: String) { /* ... */ }
}

注册服务

在清单文件中声明您的服务,以便 Android 将消息传递给它。必须使用 MESSAGING_EVENT 意图筛选器。

<!-- AndroidManifest.xml inside <application> -->
<service
    android:name=".MyFcmService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

通知消息与数据消息

FCM 消息分为两种:

  • 通知消息 — 当应用在后台运行时,FCM 会自动将其显示在通知栏中;只有应用处于前台时,onMessageReceived 才会触发。
  • 数据消息 — 始终以键值映射的形式传递给 onMessageReceived,因此您可以自行控制处理方式。

从 message.data 中读取自定义字段。

import com.google.firebase.messaging.RemoteMessage

fun handle(message: RemoteMessage) {
    val type = message.data["type"]      // your custom field
    val itemId = message.data["itemId"]
    when (type) {
        "chat" -> openChat(itemId)
        "promo" -> openPromo(itemId)
    }
}
fun openChat(id: String?) {}
fun openPromo(id: String?) {}

构建通知渠道

从 Android 8 开始,每条通知都需要一个渠道。请在应用启动时创建一次;系统会使用渠道控制声音、重要程度以及用户针对每个渠道设置的选项。

import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context

fun createChannel(context: Context) {
    val channel = NotificationChannel(
        "messages",
        "Messages",
        NotificationManager.IMPORTANCE_HIGH
    )
    val manager = context.getSystemService(NotificationManager::class.java)
    manager.createNotificationChannel(channel)
}

显示通知

使用 NotificationCompat.Builder 构建通知,并将其关联到您的渠道 ID,然后使用 NotificationManagerCompat 发布通知。

请记住:在 API 33 及更高版本中,只有用户授予 POST_NOTIFICATIONS 权限后,通知才会显示。

import android.content.Context
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat

fun showNotification(context: Context, title: String, body: String) {
    val notification = NotificationCompat.Builder(context, "messages")
        .setSmallIcon(android.R.drawable.ic_dialog_info)
        .setContentTitle(title)
        .setContentText(body)
        .setAutoCancel(true)
        .build()

    NotificationManagerCompat.from(context).notify(1, notification)
}

订阅主题

您可以向主题广播消息,而不必逐个跟踪令牌。客户端订阅主题名称后,您的服务器就可以向所有订阅者发送一条消息。

这非常适合用于 news、sports 或 all-users 等公告。

import com.google.firebase.Firebase
import com.google.firebase.messaging.messaging
import kotlinx.coroutines.tasks.await

suspend fun subscribeToNews() {
    Firebase.messaging.subscribeToTopic("news").await()
}

suspend fun unsubscribeFromNews() {
    Firebase.messaging.unsubscribeFromTopic("news").await()
}

快速检查

您的应用处于后台,并从 FCM 接收到一条纯通知消息。会发生什么?

回顾:Cloud Messaging

现在,您已经可以通过推送通知联系用户:

  • 添加 firebase-messaging,并在 API 33 及更高版本上请求 POST_NOTIFICATIONS。
  • 每次安装都有一个FCM 令牌;将其上传到您的服务器。
  • 继承 FirebaseMessagingService,并重写 onMessageReceived / onNewToken。
  • 了解通知消息与数据消息之间的区别。
  • 创建通知渠道,使用 NotificationCompat 构建通知,或通过主题广播消息。

至此,Firebase 三大功能已经介绍完毕:身份验证、Firestore 和 Messaging — 它们共同构成 Android 应用的完整后端。

常见问题解答

「使用 Cloud Messaging 推送」课时是免费的吗?

是的 — 「使用 Cloud Messaging 推送」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。

「使用 Cloud Messaging 推送」这节课中我会学到什么?

发送和接收 FCM 通知 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Android Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「使用 Cloud Messaging 推送」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Android Academy 课中编写并运行代码吗?

能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 设置 Firebase
  2. Firebase 身份验证
  3. Cloud Firestore 基础
  4. 使用 Cloud Messaging 推送
← 返回 Android Academy