You need to enable JavaScript to run this app. 如何获取后台接收、前台运行时点击的FCM推送通知载荷数据
优惠活动
大模型
产品
解决方案
定价
更多

如何获取后台接收、前台运行时点击的FCM推送通知载荷数据

推送通知点击载荷获取解决方案

根因

你拿不到载荷的核心原因是:当应用已有存活Activity栈时,点击通知触发的Activity启动不会走onCreate流程,系统只会回调栈顶Activity的onNewIntent方法,你之前通过getIntent()拿到的是Activity首次启动时的旧Intent,自然没有通知携带的新extras参数。

具体修复步骤

1. 调整通知PendingIntent配置

构建通知的PendingIntent时,需要注意两个配置项:

  • 跳转目标不要指定已销毁的闪屏页,统一指定应用常驻的栈顶Activity(比如首页),或者专用的推送跳转中转Activity
  • PendingIntent标记位按系统版本设置:
    • Android 12及以上:PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
    • Android 12以下:PendingIntent.FLAG_UPDATE_CURRENT
      这个标记可以确保PendingIntent携带的extras是最新的,不会复用历史缓存的空数据。

2. 重写目标Activity的onNewIntent方法

在你指定的跳转目标Activity中添加以下逻辑,接收通知携带的新Intent:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // 更新当前Activity关联的Intent,后续在任意生命周期取都能拿到最新数据
    setIntent(intent);
    // 可直接在此处处理推送载荷
    Bundle notificationExtras = intent.getExtras();
    if (notificationExtras != null) {
        // 你的推送处理逻辑,比如跳转详情页、展示弹窗等
    }
}

3. 兼容onResume统一处理逻辑

如果你之前已经在onResume里写了统一的载荷处理代码,只需要确保每次onResume都从当前Intent取参数即可,onNewIntent里调用setIntent后,onResume执行时拿到的就是最新的通知载荷。

备选通用方案(多Activity场景适用)

如果你的应用页面层级复杂,不确定点击通知时栈顶是哪个Activity,可以用广播中转的方式规避生命周期问题:

  • 构建通知时,将PendingIntent设置为广播类型,携带所有推送载荷
  • 在应用全局注册该广播的动态接收器,收到广播后直接处理推送逻辑,不受当前Activity栈状态影响

注意事项

如果你使用第三方推送SDK实现通知下发,需要关闭SDK自带的默认通知点击跳转逻辑,自行配置PendingIntent,避免SDK拦截吞掉extras参数。

内容的提问来源于stack exchange,提问作者Tran Hoai Nam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 04:54:05