自定义通知跳转MainActivity无法获取fcmService额外参数问题
问题排查与解决方案
问题原因分析
- PendingIntent缓存复用:你创建
PendingIntent时使用了PendingIntent.FLAG_IMMUTABLE且requestCode固定为0,如果系统中已经存在相同目标组件、相同requestCode的PendingIntent实例,会直接复用旧对象,导致新添加的fcmService参数无法更新到新的PendingIntent中。 - Intent获取时机错误:当使用
FLAG_ACTIVITY_SINGLE_TOP启动模式时,如果MainActivity已经处于栈顶,点击通知不会重新触发onCreate方法,而是调用onNewIntent。你仅在onCreate中获取参数,自然无法拿到新传递的extra值。
解决方案
1. 修复PendingIntent创建逻辑
修改PendingIntent的创建代码,添加FLAG_UPDATE_CURRENT标记确保参数更新,同时使用唯一的requestCode避免复用冲突:
val pendingIntent: PendingIntent = PendingIntent.getActivity( this, CustomNotificationListener.WHAT_NOTIFICATION_ID, // 使用通知ID作为唯一requestCode intent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT )
2. 调整MainActivity的参数获取逻辑
重写onNewIntent方法,确保在Activity复用时能获取到最新的Intent参数:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = MainActivityBinding.inflate(layoutInflater) setContentView(binding.root) // 初始创建时处理参数 handleFcmExtra(intent) } override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) // 更新Activity保存的Intent实例 setIntent(intent) // 处理新传递的参数 handleFcmExtra(intent) } private fun handleFcmExtra(intent: Intent?) { val fcmServiceExtra = intent?.getStringExtra("fcmService") Log.d("fcmExtra", "$fcmServiceExtra") }
额外注意事项
- 如果使用
FLAG_ACTIVITY_CLEAR_TASK标记,会清空任务栈并重新创建MainActivity,此时onCreate会被触发,但仍需配合FLAG_UPDATE_CURRENT确保PendingIntent的参数是最新的。 - 检查项目中是否有其他地方创建了指向
MainActivity的PendingIntent,避免相同requestCode导致的缓存冲突。
内容的提问来源于stack exchange,提问作者BRDroid
相关产品推荐
相关产品推荐

