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

Xamarin Android如何监听FCM前台消息的送达事件?

在Xamarin Android中捕获FCM前台消息的正确姿势

我明白你遇到的问题——当应用处于前台时,FCM的OnMessageReceived事件没触发,这其实是FCM两种消息类型的处理逻辑差异导致的,我来帮你拆解解决:

问题根源:FCM消息类型的不同处理逻辑

FCM分为两种消息:

  • 通知消息(Notification Messages):由FCM SDK自动处理,应用前台时系统会直接弹出通知,不会走OnMessageReceived;后台时同样由系统展示,点击后才会把数据传递给目标页面。
  • 数据消息(Data Messages):无论应用在前台还是后台,都会直接触发OnMessageReceived,所有内容都需要你自己处理(包括构建通知)。

你的Postman请求同时包含了notification和data字段,属于混合消息,这种情况下前台依然会由系统处理通知部分,所以OnMessageReceived不会被触发。

解决方案一:使用纯数据消息(推荐)

把所有需要传递的内容都放到data字段里,这样无论前台后台,消息都会进入OnMessageReceived,你可以完全自定义通知的展示逻辑。

修改后的Postman请求体:

{ 
  "to":"eXj6c43Jueu6pZ7J6nlPJk81plm5UGjNAwzEGDMM2WQa3EBSxJ-85GDn09wqJ6mE4Jq5nkJ1Qdo", 
  "data" : { 
    "OrganizationId":"6166",
    "moduleName":"Homework",
    "bodyText" : "New homework assigned",
    "title" : "KG school",
    "click_action":"SISActivity"
  } 
}

然后在你的FirebaseMessagingService实现中处理消息:

public class MyFirebaseMessagingService : FirebaseMessagingService
{
    public override void OnMessageReceived(RemoteMessage message)
    {
        base.OnMessageReceived(message);
        
        // 从data字典中提取所有需要的字段
        if (message.Data.TryGetValue("title", out var title) &&
            message.Data.TryGetValue("bodyText", out var body) &&
            message.Data.TryGetValue("OrganizationId", out var orgId))
        {
            // 调用自定义方法构建并显示通知
            ShowCustomNotification(title, body, orgId);
        }
    }

    private void ShowCustomNotification(string title, string body, string organizationId)
    {
        // 构建点击通知后跳转的Intent
        var intent = new Intent(this, typeof(SISActivity));
        intent.PutExtra("OrganizationId", organizationId);
        intent.AddFlags(ActivityFlags.ClearTop); // 确保返回栈正确
        
        // 创建PendingIntent
        var pendingIntent = PendingIntent.GetActivity(
            this, 
            0, 
            intent, 
            PendingIntentFlags.OneShot | PendingIntentFlags.Immutable);

        // 构建通知(记得提前创建通知渠道,Android 8.0+必需)
        var notificationBuilder = new NotificationCompat.Builder(this, "your_notification_channel_id")
            .SetSmallIcon(Resource.Drawable.ic_notification_icon)
            .SetContentTitle(title)
            .SetContentText(body)
            .SetAutoCancel(true)
            .SetPriority(NotificationCompat.PriorityHigh)
            .SetContentIntent(pendingIntent);

        // 显示通知
        var notificationManager = NotificationManagerCompat.From(this);
        notificationManager.Notify(0, notificationBuilder.Build());
    }
}

解决方案二:适配混合消息(不推荐)

如果业务必须保留notification字段,你需要确保AndroidManifest.xml中正确配置了FirebaseMessagingService和目标Activity的Intent Filter:

  1. 注册你的Messaging Service:
<service
    android:name=".MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>
  1. 给SISActivity添加对应的Intent Filter:
<activity android:name=".SISActivity">
    <intent-filter>
        <action android:name="SISActivity" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

但要注意:即使这样配置,前台时混合消息的通知依然会由系统自动展示,OnMessageReceived还是不会触发——只有当用户点击后台通知时,data字段的内容才会传递到SISActivity的Intent中。所以这种方式无法满足你“前台获取消息送达事件”的需求,还是推荐纯数据消息方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:28:39