如何获取后台接收、前台运行时点击的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是最新的,不会复用历史缓存的空数据。
- Android 12及以上:
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
相关产品推荐
相关产品推荐

