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

如何在Flutter中重写Android原生Firebase的onNewToken方法

在Flutter中重写Firebase的onNewToken方法

在Flutter中重写onNewToken不能直接在build.gradle中操作,需要通过Android原生代码实现,具体步骤如下:

1. 创建自定义FirebaseMessagingService类

在Flutter项目的android/app/src/main/java/[你的应用包名]/目录下,创建一个Java类(比如MyMessagingService.java),继承FirebaseMessagingService并重写onNewToken方法:

package com.your.app.package; // 替换为你的实际应用包名

import com.google.firebase.messaging.FirebaseMessagingService;

public class MyMessagingService extends FirebaseMessagingService {
    @Override
    public void onNewToken(String token) {
        super.onNewToken(token);
        // 在这里添加你的自定义逻辑,比如保存token到本地、发送至服务器等
    }
}

2. 在AndroidManifest.xml中注册服务

打开android/app/src/main/AndroidManifest.xml,在<application>标签内部添加自定义服务的注册配置:

<service
    android:name=".MyMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

3. (可选)将token传递到Flutter端

如果需要在Flutter层获取新生成的token,可以通过MethodChannel实现原生与Flutter的通信:

原生端(MyMessagingService内补充)

import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.embedding.engine.dart.DartExecutor;
import io.flutter.plugin.common.MethodChannel;

public class MyMessagingService extends FirebaseMessagingService {
    private static final String CHANNEL = "com.your.app.package/firebase_token";

    @Override
    public void onNewToken(String token) {
        super.onNewToken(token);
        // 把token传递给Flutter端
        FlutterEngine flutterEngine = new FlutterEngine(this);
        flutterEngine.getDartExecutor().executeDartEntrypoint(
            DartExecutor.DartEntrypoint.createDefault()
        );
        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
            .invokeMethod("updateToken", token);
    }
}

Flutter端(Dart代码)

在main.dart或对应业务页面中监听通道回调:

import 'package:flutter/services.dart';

void main() {
  const MethodChannel tokenChannel = MethodChannel('com.your.app.package/firebase_token');
  tokenChannel.setMethodCallHandler((MethodCall call) async {
    if (call.method == 'updateToken') {
      String newToken = call.arguments;
      // 处理从原生传来的新token
      print('获取到新的Firebase token: $newToken');
    }
  });
  runApp(const YourApp());
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:31:58