如何检测应用内更新FLEXIBLE模式下的「等待Wi-Fi可用」状态?
检测应用内更新FLEXIBLE模式下「等待Wi-Fi可用」状态的方案
Google Play Core的In-App Update API并没有提供专门的枚举值来直接标识「等待Wi-Fi可用」的状态——这个状态是由Play Store后台管理的,不会直接通过InstallState传递给应用端。要实现你需要的检测逻辑,得通过本地标记+网络状态+更新会话查询的组合方式来处理,具体步骤如下:
1. 记录用户的「等待Wi-Fi」选择
当用户在更新对话框中选择「等待Wi-Fi可用」并点击更新按钮时,立刻用SharedPreferences保存一个状态标记,必要时可以同时记录当前更新会话的ID(如果能获取到):
// 在用户选择等待Wi-Fi的回调中执行 val updatePrefs = context.getSharedPreferences("app_update_state", Context.MODE_PRIVATE) updatePrefs.edit() .putBoolean("is_waiting_for_wifi", true) // 如果能获取到更新会话ID,可额外保存用于后续校验 .putString("active_update_session", updateInfo.sessionId().toString()) .apply()
2. 应用重启后的状态检测
应用重启后,按以下逻辑判断是否处于「等待Wi-Fi」的待处理状态:
- 读取本地保存的
is_waiting_for_wifi标记 - 检查当前网络是否为Wi-Fi
- 查询Play Core的更新会话状态,确认更新是否仍在进行中
示例代码:
val updatePrefs = getSharedPreferences("app_update_state", Context.MODE_PRIVATE) val isWaitingForWifi = updatePrefs.getBoolean("is_waiting_for_wifi", false) if (isWaitingForWifi) { // 检查当前网络是否为Wi-Fi val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val activeNetwork = connectivityManager.activeNetwork val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork) val isWifiConnected = networkCapabilities?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true // 查询当前更新会话状态 appUpdateManager.appUpdateInfo.addOnSuccessListener { updateInfo -> val updateInProgress = updateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS if (updateInProgress) { if (isWifiConnected) { // Wi-Fi已可用,继续执行更新流程 appUpdateManager.startUpdateFlowForResult( updateInfo, AppUpdateType.FLEXIBLE, this, REQUEST_CODE_FLEXIBLE_UPDATE ) // 清除等待标记 updatePrefs.edit().putBoolean("is_waiting_for_wifi", false).apply() } else { // 仍在等待Wi-Fi,可向用户展示提示(比如"更新将在Wi-Fi可用时自动继续") showWifiWaitingTip() } } else { // 更新会话已失效(比如用户手动取消了更新),清除标记 updatePrefs.edit().putBoolean("is_waiting_for_wifi", false).apply() } } }
3. 监听更新状态变化,同步清理标记
在InstallStateUpdateListener中,当更新完成、取消或失败时,要及时清理本地的等待标记,避免下次启动时误判:
val installStateListener = InstallStateUpdatedListener { state -> when (state.installStatus()) { InstallStatus.DOWNLOADED -> { // 更新已下载完成,清除等待标记 updatePrefs.edit().putBoolean("is_waiting_for_wifi", false).apply() // 触发安装提示逻辑 showInstallPrompt() } InstallStatus.CANCELED, InstallStatus.FAILED -> { // 更新取消或失败,清除等待标记 updatePrefs.edit().putBoolean("is_waiting_for_wifi", false).apply() } // 其他状态按需处理 else -> {} } } // 记得在合适的时机注册/注销监听器 appUpdateManager.registerListener(installStateListener)
补充说明
你提到的InstallStatus.PENDING无法覆盖这个场景,是因为该状态对应的是「更新请求已提交,但Play Store尚未开始处理(比如等待设备空闲)」,而「等待Wi-Fi」是Play Store后台在等待网络条件满足,这个状态不会主动通知应用,所以必须通过本地标记来追踪用户的选择行为,再结合网络状态和更新会话状态来综合判断。
内容的提问来源于stack exchange,提问作者musclebananas
相关产品推荐
相关产品推荐

