Flutter Android自定义FirebaseMessagingService实现方案咨询
Flutter Android端自定义FirebaseMessagingService实现示例
1. 配置AndroidManifest.xml
在android/app/src/main/AndroidManifest.xml中注册你自定义的Messaging服务,替换默认的Firebase消息处理服务,原有其他Firebase相关配置不需要修改:
<service android:name=".MyCustomFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
2. 实现自定义Kotlin服务类
在android/app/src/main/kotlin/[你的应用包名路径]下新建MyCustomFirebaseMessagingService.kt文件,核心是继承FlutterFirebaseMessagingService而非原生的FirebaseMessagingService,保证Flutter端默认消息接收逻辑正常运行:
import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingService import com.google.firebase.messaging.RemoteMessage class MyCustomFirebaseMessagingService : FlutterFirebaseMessagingService() { // 收到推送消息时触发,前台、后台状态均可回调 override fun onMessageReceived(remoteMessage: RemoteMessage) { // 必须先调用父类方法,保证Flutter端能正常收到通知和data数据 super.onMessageReceived(remoteMessage) // 以下为你的自定义Kotlin逻辑 val notificationTitle = remoteMessage.notification?.title ?: "" val notificationBody = remoteMessage.notification?.body ?: "" val messageData = remoteMessage.data // 示例:执行自定义业务逻辑,比如数据存储、事件统计、本地任务触发等 runCustomTask(notificationTitle, notificationBody, messageData) } // FCM token更新时触发 override fun onNewToken(token: String) { // 同样先调用父类方法,保证Flutter端能获取到最新token super.onNewToken(token) // 自定义逻辑:比如将最新token上传到你的业务服务器 uploadNewToken(token) } private fun runCustomTask(title: String, body: String, data: Map<String, String>) { // 你的业务逻辑实现 } private fun uploadNewToken(token: String) { // token上传逻辑实现 } }
3. 关键注意事项
- 禁止直接继承原生
FirebaseMessagingService,必须继承FlutterFirebaseMessagingService,否则会覆盖FlutterFire的默认处理逻辑,导致Flutter应用无法正常接收推送 - 所有重写的方法必须优先执行
super.xxx()父类逻辑,再编写自定义代码,避免Flutter端丢失消息数据 - 如果你发的是通知类推送,应用完全杀死的状态下系统会直接展示通知,不会触发
onMessageReceived,只有用户点击通知打开应用时才会把数据回传给Flutter;如果需要杀死状态下也能执行自定义逻辑,需要发送数据类推送,同时根据Android系统版本申请对应的后台运行权限 - Flutter端原有
firebase_messaging的监听逻辑不需要修改,notification、data字段都可以正常获取
内容的提问来源于stack exchange,提问作者Neal Soni
相关产品推荐
相关产品推荐

