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

