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:
- 注册你的Messaging Service:
<service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
- 给
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
相关产品推荐
相关产品推荐

