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

