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

如何在接收FCM消息时自动打开Android应用?现有代码求助

解决FCM推送自动打开应用的问题

要实现接收FCM推送时自动打开应用,核心是确保消息能触发onMessageReceived回调,并且在回调中直接启动目标Activity。以下是具体修改方案:

1. 调整推送Payload(Python端)

纯notification类型的消息在应用后台时会被系统直接处理,不会进入你的MyFireBaseMessagingService,因此需要改用data类型消息,确保无论应用处于前台/后台,都能触发回调:

def sendPush(title, msg, registration_token, dataObject=None):
    # 构建data字段,包含推送内容及自定义数据
    data = {
        "title": title,
        "body": msg,
    }
    if dataObject:
        data.update(dataObject)
    
    message = messaging.MulticastMessage(
        data=data,  # 使用data消息确保后台也能触发onMessageReceived
        tokens=registration_token,
    )
    # 执行发送
    response = messaging.send_multicast(message)
    print(f"推送成功:{response.success_count} 条消息已发送")

2. 修改Android端FCM服务代码

在onMessageReceived中直接启动目标Activity,同时保留通知显示(可选):

public class MyFireBaseMessagingService extends FirebaseMessagingService {

    private static final String CHANNEL_ID = "my_channel_id";
    private static final String TAG = "FCM";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        try {
            // 从data字段获取推送内容,兼容两种消息类型
            String title = remoteMessage.getData().get("title");
            String body = remoteMessage.getData().get("body");
            
            // 若data字段无内容, fallback到notification字段
            if (title == null && remoteMessage.getNotification() != null) {
                title = remoteMessage.getNotification().getTitle() != null ? remoteMessage.getNotification().getTitle() : "FCM Message";
            }
            if (body == null && remoteMessage.getNotification() != null) {
                body = remoteMessage.getNotification().getBody() != null ? remoteMessage.getNotification().getBody() : "";
            }

            // 直接启动MainActivity2,适配前台/后台状态
            Intent intent = new Intent(this, MainActivity2.class);
            // 确保从Service启动Activity,且避免重复创建实例
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            intent.putExtra("notification_clicked", true);
            intent.putExtra("title", title);
            intent.putExtra("body", body);
            startActivity(intent);

            // 可选:显示通知,方便用户从通知栏再次打开应用
            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, CHANNEL_ID)
                    .setContentTitle(title)
                    .setContentText(body)
                    .setSmallIcon(R.drawable.ic_launcher_background)
                    .setAutoCancel(true)
                    // Android 12+ 需添加FLAG_IMMUTABLE
                    .setContentIntent(PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE));

            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            createNotificationChannel(notificationManager);
            // 使用当前时间作为通知ID,避免覆盖旧通知
            notificationManager.notify((int) System.currentTimeMillis(), notificationBuilder.build());

        } catch (Exception e) {
            Log.e(TAG, "处理通知出错: " + e.getMessage());
        }
    }

    private void createNotificationChannel(NotificationManager notificationManager) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence channelName = "My Channel";
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, channelName, NotificationManager.IMPORTANCE_DEFAULT);
            notificationManager.createNotificationChannel(channel);
        }
    }
}

关键说明

  • data消息的必要性:notification消息在后台时由系统接管,无法触发onMessageReceived,因此必须用data消息确保回调执行。
  • Activity启动Flag:FLAG_ACTIVITY_NEW_TASK是从非Activity上下文(如Service)启动Activity的必需Flag;FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP确保应用后台时直接唤醒现有实例,而非创建新页面。
  • PendingIntent兼容性:Android 12及以上版本要求添加FLAG_IMMUTABLE或FLAG_MUTABLE,避免运行时异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 19:20:03