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

FCM通知到达时无交互打开指定Activity的问题求助

解决FCM后台/杀死状态下自动打开Activity的问题

问题根源

FCM消息分为两种类型:

  • 通知消息(notification payload):当App处于后台或被杀死状态时,系统会直接接管通知展示,不会触发onMessageReceived方法,你的自动启动Activity逻辑自然无法执行。
  • 数据消息(data payload):无论App处于前台、后台还是被杀死状态,都会触发onMessageReceived,能保证你的代码逻辑被执行。

你当前的代码中依赖了message.notification字段,说明发送的是通知消息,这就是后台/杀死状态下功能失效的原因。


解决方案

1. 发送纯数据消息

服务器端发送FCM消息时,不要包含notification字段,所有参数都放在data字段中,示例结构如下:

{
  "to": "目标设备令牌",
  "data": {
    "userName": "用户名称",
    "title": "通知标题",
    "body": "通知内容"
  }
}

2. 修改客户端代码适配数据消息

调整参数获取逻辑,并适配Android 10+的后台启动限制:

override fun onMessageReceived(message: RemoteMessage) {
    super.onMessageReceived(message)

    val intent = Intent(this, ShowNotificationActivity::class.java)
    // 从data字段获取所有参数
    intent.putExtra(Helper.USERNAME, message.data["userName"])
    intent.putExtra("title", message.data["title"])
    intent.putExtra("body", message.data["body"])
    
    // 设置Activity启动flags,确保后台能正常启动
    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP

    // 适配Android 10及以上的后台启动限制
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        val pendingIntent = PendingIntent.getActivity(
            this,
            0,
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
        )
        pendingIntent.send()
    } else {
        applicationContext.startActivity(intent)
    }
}

3. 可选:配置Activity启动模式

如果需要避免重复打开ShowNotificationActivity,可以在AndroidManifest.xml中设置其启动模式:

<activity
    android:name=".ShowNotificationActivity"
    android:launchMode="singleTop">
</activity>

配合代码中的FLAG_ACTIVITY_SINGLE_TOP(加到flags里),当Activity已在栈顶时不会重复创建实例。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:13:16