You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测应用内更新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」的待处理状态:

  1. 读取本地保存的is_waiting_for_wifi标记
  2. 检查当前网络是否为Wi-Fi
  3. 查询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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:50:30