后台导航与路线缓存
选择正确入口
| 入口 | 适合场景 | 需要宿主负责的部分 |
|---|---|---|
| NavigationClient | 自定义前台导航控制 | Activity 生命周期、后台运行策略与定位权限 |
| NavigationController | 将路线交给 SDK 前台导航服务 | 在可见 Activity 中绑定、等待就绪、开始导航、管理结束动作 |
| NavigationForegroundService | 需要直接接入服务状态和准备流程 | 服务绑定、有效路线和位置、观察者、平台权限及业务 UI |
| SukhaMapFragment | 使用完整地图与导航界面 | 提供授权、权限、语言、容器与业务生命周期 |
控制器调用顺序
- 创建
NavigationController(context),设置NavigationController.Listener。 - 调用
initialize(),等待onReady(...)和onServiceReady();两项分别表示数据初始化和服务绑定就绪。 - 调用
startLocation(),取得新鲜且符合质量要求的位置。 - 调用
calculateDriveRoute(destination, name),等待onCalculateRouteSuccess(...)。 - 从可见 Activity 的用户操作调用
startNavi(NavigationClient.GPSNaviMode)。 - 导航服务通过监听器更新剩余路程、位置、到达及状态。
- 结束行程调用
stopNavi()。close()只释放宿主连接,已开始的服务行程可以继续,不能把关闭页面等同于结束导航。
方法的精确签名见 Android 导航服务 API。模拟导航只用于开发验证,不能代替真实 GPS。
Android 运行要求
首次定位前由宿主向用户说明用途,并完成系统要求的运行时定位权限申请。检查合并后的 Manifest 中的前台服务、定位服务类型及对应权限;在可见页面启动服务。不同 Android 系统版本及厂商后台策略不同,需要实际设备验证通知、锁屏和后台定位。
宿主结束业务导航时明确停止行程,释放监听器。不能为了维持服务而隐藏必要通知,也不要把定位失败改写为成功。
缓存导航的使用边界
完整导航流程会准备路线、步骤和沿途所需数据。准备未完成就断网,不能保证完整离线能力。地图画面缓存、路线缓存和可用于重新规划的路网缓存不是同一种资源。
断网后可沿已准备路线继续引导;偏航后全新路线是否可用取决于已缓存路网范围。地点搜索、首次获取路线和未缓存区域的重算仍可能需要网络。授权被明确拒绝、缓存不匹配或失效时按服务状态处理,不绕过授权。
定位不可靠时等待恢复,期间不应继续猜测转弯位置。重新联网或定位恢复后观察实际状态回调,不反复销毁重建导航服务。
多语言
完整 UI 的显示与语音可分别由 SukhaMapConfig.Builder.language、voiceLanguage 指定。服务提供 setLanguage(String)、setVoiceLanguage(String);语言使用 zh-CN、en-US、my-MM。不要把服务方法当成 NavigationClient 的同名方法调用。