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

Flutter集成Firebase Messaging后设备重启如何接收通知?

Flutter集成Firebase Messaging解决设备重启后无法接收通知的方案

在Flutter中解决设备重启后无法接收Firebase通知的问题,核心是通过Android原生广播监听设备启动完成事件,重新初始化Firebase Messaging服务,具体步骤如下:

1. 添加Android权限

在android/app/src/main/AndroidManifest.xml中添加必要权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

2. 自定义启动完成广播接收器

在Android原生代码中创建广播接收器,监听设备启动完成事件并重连Firebase Messaging:

Kotlin实现(推荐)

创建android/app/src/main/kotlin/[你的包名]/BootCompleteReceiver.kt:

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.google.firebase.messaging.FirebaseMessaging

class BootCompleteReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent?.action == Intent.ACTION_BOOT_COMPLETED || 
            intent?.action == "android.intent.action.QUICKBOOT_POWERON") {
            // 重新获取FCM令牌,确保服务连接正常
            FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    val newToken = task.result
                    // 可选:将新令牌同步到你的后端服务器
                }
            }
        }
    }
}

Java实现

如果使用Java,创建android/app/src/main/java/[你的包名]/BootCompleteReceiver.java:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.google.firebase.messaging.FirebaseMessaging;

public class BootCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction()) ||
            "android.intent.action.QUICKBOOT_POWERON".equals(intent.getAction())) {
            FirebaseMessaging.getInstance().getToken()
                .addOnCompleteListener(task -> {
                    if (task.isSuccessful()) {
                        String newToken = task.getResult();
                        // 可选:同步令牌到后端
                    }
                });
        }
    }
}

3. 注册广播接收器

在AndroidManifest.xml中注册刚才创建的接收器:

<receiver
    android:name=".BootCompleteReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        <!-- 适配部分品牌设备的快速重启事件 -->
    </intent-filter>
</receiver>

4. Flutter端补充配置

  • 确保在main方法中尽早初始化Firebase:
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  // 初始化FCM并获取令牌
  final fcmToken = await FirebaseMessaging.instance.getToken();
  // 同步令牌到后端(如果需要)
  runApp(const MyApp());
}
  • 针对Android 12及以上版本,确保已请求通知权限:
import 'package:permission_handler/permission_handler.dart';

Future<void> requestNotificationPermission() async {
  final status = await Permission.notification.request();
  if (!status.isGranted) {
    // 处理权限拒绝逻辑
  }
}

注意事项

部分国产Android厂商(如小米、华为、OPPO)存在后台限制,即使配置了广播接收器,也可能因应用被禁用自启动而无法收到BOOT_COMPLETED事件。这种情况下,需要在应用内添加引导,提示用户前往系统设置开启应用的自启动权限和后台运行权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:12:30