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
相关产品推荐
相关产品推荐

