为什么启动Google Maps导航后后台运行的Flutter应用会被杀死?
Flutter旅游应用跳转Google Maps后台被杀问题解决方案
- 优先排查Android端权限配置,release模式下需在
android/app/src/main/AndroidManifest.xml中补充以下权限声明,同时在应用启动时主动引导用户授权:
<!-- 申请忽略电池优化权限 --> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <!-- 前台服务相关权限 --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" /> <!-- 后台位置获取权限 --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
多数厂商定制系统默认会禁止普通应用后台长期运行,和应用内存占用无关,拿到忽略电池优化权限后进程优先级会大幅提升。
- 补充release模式混淆白名单配置,避免后台服务相关代码被混淆工具误删,在
android/app/proguard-rules.pro中添加以下规则:
# map_launcher插件混淆白名单 -keep class com.alexmiller.map_launcher.** { *; } # 后台位置服务插件混淆白名单,如使用其他插件替换对应包名即可 -keep class com.lyokone.location.** { *; } # 所有系统服务子类避免混淆 -keep class * extends android.app.Service { *; }
- 调整后台位置服务启动模式,不要使用纯后台服务,强制开启前台服务模式,在服务运行期间常驻通知栏,将进程优先级提升至和前台应用同级,示例代码如下:
// 以background_location插件为例,其他位置服务插件同理开启前台配置 await BackgroundLocation.startLocationService( foreground: true, notificationTitle: "后台运行中", notificationMsg: "正在为您保留导航相关数据", notificationIcon: "@mipmap/ic_launcher", );
- 调整跳转Google Maps的启动参数,避免当前应用Activity被系统回收,跳转时指定正确的Intent启动Flag:
await MapLauncher.showMarker( mapType: MapType.google, coords: Coords(目标纬度, 目标经度), title: "目的地名称", extraParams: {'android_intent_flags': 'FLAG_ACTIVITY_NEW_TASK'}, );
- 如果涉及iOS端,需检查
Info.plist中是否开启了后台位置运行权限,同时确认release模式下权限申请逻辑和debug模式一致,iOS未授权后台位置权限时,应用退后台30秒后会被系统自动挂起销毁。
内容的提问来源于stack exchange,提问作者BOUACHRA Zakaria
相关产品推荐
相关产品推荐

