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

Firebase Cloud Messaging后台/关闭状态下消息通知捕获问题求助

解决FCM后台/关闭状态下无法获取extraData的问题

我太懂这个坑了!你现在遇到的问题完全是FCM消息类型导致的:当推送的是通知消息(payload里包含notification字段)时,只要应用在后台或者完全关闭,Android系统就会直接接管通知的展示,根本不会触发你的onMessageReceived方法,自然拿不到data里的extraData。

下面给你两个靠谱的解决方案,按需选择:

方案1:只发送「数据消息」(推荐)

直接去掉payload里的notification字段,只保留data字段。这种情况下,不管应用处于前台、后台还是关闭状态,消息都会被onMessageReceived接收,你可以完全自定义通知的样式、图标,还能把extraData塞进通知的点击Intent里。

举个推送的payload示例:

{
  "to": "你的设备Token",
  "data": {
    "title": "我的自定义标题",
    "body": "这是消息内容",
    "extraData": "需要传递的特定数据"
  }
}

然后优化你的MyFirebaseMessagingService,把extraData绑定到通知的点击事件上:

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage message) {
        super.onMessageReceived(message);
        
        // 从data里取出所有需要的参数
        String title = message.getData().get("title");
        String msgBody = message.getData().get("body");
        String extraData = message.getData().get("extraData");
        
        // 构建点击通知后要打开的Activity Intent
        Intent intent = new Intent(this, TargetActivity.class);
        intent.putExtra("extraData", extraData);
        // 确保打开的是新的任务栈,避免重复实例
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        PendingIntent pendingIntent = PendingIntent.getActivity(
                this, 
                0, 
                intent, 
                PendingIntent.FLAG_IMMUTABLE // Android 12+ 需要设置这个flag
        );
        
        // 自定义通知样式
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "YOUR_NOTIFICATION_CHANNEL_ID")
                .setSmallIcon(R.drawable.your_custom_icon) // 替换成你的图标
                .setContentTitle(title)
                .setContentText(msgBody)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setContentIntent(pendingIntent)
                .setAutoCancel(true); // 点击后自动取消通知
        
        // 显示通知
        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
        notificationManager.notify(1, builder.build());
        
        Log.d("MyFirebaseMsgService", "自定义通知已发送");
    }
}

方案2:兼容通知消息(如果需要支持iOS)

如果因为跨平台需求必须保留notification字段,那可以把extraData同时放在data字段里。当系统自动展示通知后,用户点击通知会启动你的应用,你可以在启动的Activity里通过Intent获取data中的参数:

// 在你要打开的Activity的onCreate方法中
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_target);
    
    Intent intent = getIntent();
    if (intent != null && intent.getExtras() != null) {
        // 获取extraData
        String extraData = intent.getExtras().getString("extraData");
        // 在这里根据extraData加载特定数据
        loadSpecificData(extraData);
    }
}

private void loadSpecificData(String extraData) {
    // 你的业务逻辑
}

额外注意事项

  • 确保你的MyFirebaseMessagingService在AndroidManifest里正确注册:
    <service
        android:name=".MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    
  • Android 13及以上版本,需要在Manifest里添加通知权限,并在运行时申请:
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:11:48