Flutter background_service启动异常:后台无法启动服务Intent求助
我们使用flutter_background_service包时,在Firebase Crashlytics中收到大量如下报错:
Caused by java.lang.IllegalStateException Not allowed to start service Intent { cmp=com.company.app/id.flutter.flutter_background_service.BackgroundService }: app is in background uid UidRecord{18e0a38 u0a416 RCVR idle change:uncached procs:1 proclist:20682, seq(0,0,0)}
无法在自己的设备(模拟器、新/旧物理Android设备)上复现该问题。报错提示应用在后台时无法启动服务,但我们是按照文档要求,在main函数中WidgetsFlutterBinding.ensureInitialized();之后启动服务的。
以下是排查方向和建议:
检查Android版本适配:Android 8.0(API 26)及以上对后台服务有严格限制,即使在
main中启动服务,若启动时机恰好遇到应用处于后台状态(比如系统资源紧张导致应用短暂挂起),就会触发该错误。确认是否针对API26+配置了前台服务:在AndroidManifest.xml中添加<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />权限,启动服务时调用startForeground方法展示前台通知。排查进程拉起的边缘场景:应用进程可能被推送、广播接收器、ContentProvider等系统组件唤醒,此时
main函数执行时应用实际处于后台状态,启动普通服务就会被拦截。针对这类场景,需改用前台服务或WorkManager执行任务。升级flutter_background_service版本:旧版本包可能存在Android后台限制适配的bug,尝试升级到最新稳定版,查看官方更新日志是否修复过类似问题。
分析Crashlytics崩溃上下文:查看崩溃发生时的设备信息(Android版本、机型)、应用启动原因,确认是否集中在特定版本或定制化系统机型(部分厂商对后台限制更严格),缩小排查范围。
验证启动逻辑的同步性:确保启动服务的代码是同步执行在
main函数中,没有被包裹在Future.delayed、异步await等操作中,避免因异步延迟导致服务启动时应用已进入后台。考虑替换为WorkManager:若服务仅需执行周期性或一次性后台任务,改用WorkManager更符合Android后台规范,能规避系统对后台服务的限制。
内容的提问来源于stack exchange,提问作者Kram

