Android Activity onResume中GPS检测逻辑重复执行问题求解
Android onResume GPS检测重复执行优化方案
核心解决思路是通过场景标记位区分页面返回来源,既保留用户从最近任务切回应用时自动重连硬件的能力,又避免从GPS设置页返回时逻辑重复执行。
具体实现步骤如下:
- 新增两个全局布尔标记位
// 标记是否从GPS设置页返回 private var isReturnFromGpsSetting = false // 标记硬件连接流程是否正在执行,避免重复触发 private var isHardwareConnecting = false - 跳转GPS设置页时修改标记位
触发跳转逻辑前将isReturnFromGpsSetting置为true:val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) isReturnFromGpsSetting = true startActivityForResult(intent, REQUEST_CODE_GPS_SETTING) - 改造
onResume逻辑,增加分支判断
进入onResume时先校验标记位,如果是从设置页返回、或者硬件连接流程已经在执行,就跳过原有检测逻辑:override fun onResume() { super.onResume() // 符合以下任意条件就跳过原有检测逻辑 if (isReturnFromGpsSetting || isHardwareConnecting) { return } // 原有检测逻辑 checkLocationPermission { hasPermission -> if (hasPermission && isGpsEnabled()) { startHardwareConnect() } else if (hasPermission && !isGpsEnabled()) { jumpToGpsSetting() } } } onActivityResult执行完逻辑后复位标记位
用户从设置页返回后,在onActivityResult中处理后续逻辑,执行完成后复位标记位:override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_GPS_SETTING) { if (isGpsEnabled()) { startHardwareConnect() } // 复位标记位,不影响后续切后台再返回的逻辑执行 isReturnFromGpsSetting = false } }
边界兼容:如果应用退后台后进程被系统回收,可在
onSaveInstanceState中存储两个标记位的状态,在onCreate/onRestoreInstanceState中恢复,避免状态丢失。
可选优化:
- 若项目已适配AndroidX Activity 1.2.0+版本,可将
startActivityForResult替换为Activity Result API,逻辑拆分更清晰,标记位管理更简单。 - 硬件连接方法内部加状态校验,若已处于连接中/已连接状态直接返回,进一步避免重复连接异常。
内容的提问来源于stack exchange,提问作者Jaimin Modi
相关产品推荐
相关产品推荐

