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

自定义通知跳转MainActivity无法获取fcmService额外参数问题

问题排查与解决方案

问题原因分析

  1. PendingIntent缓存复用:你创建PendingIntent时使用了PendingIntent.FLAG_IMMUTABLE且requestCode固定为0,如果系统中已经存在相同目标组件、相同requestCode的PendingIntent实例,会直接复用旧对象,导致新添加的fcmService参数无法更新到新的PendingIntent中。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:15:39