You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

应用从启动器图标启动时如何获取FCM通知携带的数据

FCM通知非点击通知启动应用时获取数据方案

常规情况下FCM系统托盘展示的通知,其携带的数据仅会在用户点击通知时,注入到对应跳转Activity的Intent extras中;通过桌面启动器图标、最近任务列表等其他路径启动应用时,系统不会主动携带该部分数据,因此直接从Intent读取会拿不到对应内容。

实现方案

  • 1. 统一接收FCM消息并本地持久化存储

建议服务端发送FCM消息时优先使用数据消息(而非包含notification字段的混合消息),数据消息无论应用处于前台/后台,都会触发FirebaseMessagingService的onMessageReceived回调,你可以在该回调中统一将需要后续跳转的通知数据持久化到本地存储:

  • 可选存储方案:SharedPreferences、Room数据库、MMKV等
  • 存储时建议携带三个字段:通知数据payload、接收时间戳、是否已处理标记
  • 若必须使用包含notification字段的混合消息,后台接收时onMessageReceived不会触发,此时需要保证所有跳转所需的参数都放在data字段中,且用户点击通知时先将该数据持久化再处理跳转,避免漏处理。

示例代码:

override fun onMessageReceived(remoteMessage: RemoteMessage) {
    super.onMessageReceived(remoteMessage)
    // 提取通知携带的自定义数据
    val payload = remoteMessage.data
    // 前台逻辑:展示自定义应用内通知
    if (isAppForeground()) {
        showInAppNotification(payload)
    } else {
        // 后台逻辑:主动弹出系统通知,替代FCM自动弹出的通知
        showSystemNotification(payload)
    }
    // 统一持久化未处理的通知数据
    saveUnprocessedNotification(payload, System.currentTimeMillis())
}
  • 2. 应用启动时读取本地存储的未处理通知

在应用入口Activity(通常是桌面启动器指向的主Activity)的onCreate、onNewIntent回调中,读取本地存储的未处理通知数据,执行对应跳转逻辑后标记该通知为已处理或直接删除:
示例代码:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // 优先判断是否是从通知点击启动,优先处理通知带的Intent数据
    intent.extras?.let { 
        if (it.containsKey("fcm_payload")) {
            processNotification(it.getString("fcm_payload"))
            return@let
        }
    }
    // 非通知启动场景,读取本地未处理通知
    val unprocessed = getUnprocessedNotification()
    if (unprocessed != null && !isExpired(unprocessed.timestamp)) {
        processNotification(unprocessed.payload)
        // 处理完后标记为已处理
        markNotificationAsProcessed(unprocessed.id)
    }
}
  • 3. 边界场景处理

    • 多通知堆积:如果同时存在多条未处理通知,可根据业务需求选择跳转最新的一条、或集中展示通知列表供用户选择
    • 过期机制:存储时添加时间戳,启动时判断通知是否超过有效期(比如24小时),过期的通知直接丢弃无需处理
    • 去重逻辑:相同业务ID的通知无需重复存储,避免多次触发跳转

内容的提问来源于stack exchange,提问作者caneru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:24:04