Flutter使用geofence_service时退出Android应用无法销毁后台服务如何解决
解决方案
1. 优先配置AndroidManifest的服务属性
这是最直接有效的方案,你只需要在你的Android项目的android/app/src/main/AndroidManifest.xml中,找到geofence_service依赖的前台服务注册节点,添加android:stopWithTask="true"属性即可:
<service android:name="com.pravera.flutter_foreground_task.service.ForegroundService" android:stopWithTask="true" /> <!-- 如果你的geofence_service版本有单独注册的服务节点,也给对应节点加上这个属性 -->
这个属性的作用是:当用户从任务管理器中划掉App移除任务时,系统会自动销毁绑定的前台服务,同时清除对应的通知,不需要额外写业务逻辑,同时不会影响App正常后台运行时的定位功能。
2. 补充Flutter层生命周期监听兜底
部分定制ROM可能对stopWithTask的适配存在差异,你可以补充监听App全局生命周期,在App进入销毁状态时主动停止服务做兜底:
首先给你的_State类混入WidgetsBindingObserver,监听应用生命周期变化:
class _CityDetailsScreenState extends State<CityDetailsScreen> with WidgetsBindingObserver { // 原有代码保持不变 @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); } @override void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); // 当应用进入即将销毁的detached状态时主动停止服务 if (state == AppLifecycleState.detached) { GeofenceService.instance.stop(); } } @override void dispose() { WidgetsBinding.instance.removeObserver(this); GeofenceService.instance.stop(); super.dispose(); } }
3. 额外适配注意事项
如果完成上述两步后仍有问题,可以在调用stop()方法后额外调用GeofenceService.instance.destroy()(视你使用的包版本支持),确保所有服务资源被完全释放。
另外你当前把WillStartForegroundTask绑定在单个页面的写法,会导致页面被路由替换、正常退出时服务就被提前停止,如果需要全局后台定位能力,建议把WillStartForegroundTask套在MaterialApp外层,和单页面生命周期解绑。
内容的提问来源于stack exchange,提问作者Martin Seubert
相关产品推荐
相关产品推荐

