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

Android应用内更新失效:适配onActivityResult弃用后仍无法工作

Android应用内更新功能故障排查

我想要实现Android In-App Update功能,但代码提示调用onActivityResult已被弃用。我参考相关方案修改后,以下是MainActivity中的代码:

private val updateFlowResultLauncher =
    registerForActivityResult(
        ActivityResultContracts.StartIntentSenderForResult(),
    ) { result ->
        if (result.resultCode == RESULT_OK) {
            // Handle successful app update
        }
    }

private fun checkAppUpdate() {
    val starter =
        IntentSenderForResultStarter { intent, _, fillInIntent, flagsMask, flagsValues, _, _ ->
            val request = IntentSenderRequest.Builder(intent)
                .setFillInIntent(fillInIntent)
                .setFlags(flagsValues, flagsMask)
                .build()

            updateFlowResultLauncher.launch(request)
        }
    appUpdateManager = AppUpdateManagerFactory.create(this)
    appUpdateManager.registerListener(installStateUpdatedListener)
    val appUpdateInfoTask = appUpdateManager.appUpdateInfo
    appUpdateInfoTask.addOnSuccessListener { appUpdateInfo: AppUpdateInfo ->
        if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
            && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)
        ) {
            try {
                appUpdateManager.startUpdateFlowForResult(
                    appUpdateInfo,
                    AppUpdateType.FLEXIBLE,
                    starter,
                    UPDATE_REQUEST_CODE
                )
            } catch (e: SendIntentException) {
                e.printStackTrace()
            }
        }
    }
}

private fun checkNewAppVersionState() {
    appUpdateManager
        .appUpdateInfo
        .addOnSuccessListener { appUpdateInfo: AppUpdateInfo ->
            if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) {
                popupAlerter()
            }
        }
}

private fun popupAlerter() {
    val snackbar = Snackbar.make(
        findViewById(android.R.id.content),
        "Nueva versión descargada, por favor reinicia",
        Snackbar.LENGTH_INDEFINITE
    )
    snackbar.setAction("REINICIAR") { view: View? ->
 appUpdateManager.completeUpdate() }
    snackbar.setActionTextColor(
        ContextCompat.getColor(this, R.color.colorAccent)
    )
    snackbar.show()
}

private fun unregisterListener() {
    appUpdateManager.unregisterListener(
        installStateUpdatedListener
    )
}

我上传了版本号低于Play商店已发布版本的内部测试包,但更新功能仍无法正常工作。请问我的代码存在什么问题?


代码问题及修复建议

1. 缺失installStateUpdatedListener具体实现

你注册了installStateUpdatedListener但未提供实现逻辑,导致无法监听更新状态变化(如下载完成、安装失败)。补充实现:

private val installStateUpdatedListener = InstallStateUpdatedListener { state ->
    when (state.installStatus()) {
        InstallStatus.DOWNLOADED -> popupAlerter()
        InstallStatus.FAILED -> {
            // 处理更新失败逻辑,比如提示用户重试
        }
        else -> {}
    }
}

2. checkNewAppVersionState未触发

当前代码没有调用checkNewAppVersionState方法,应用启动或从后台返回时,无法检测是否有已下载完成的更新等待安装。建议在onResume中添加调用:

override fun onResume() {
    super.onResume()
    checkNewAppVersionState()
}

3. 监听器注销时机缺失

需在Activity销毁时注销监听器,避免内存泄漏,在onDestroy中调用:

override fun onDestroy() {
    super.onDestroy()
    unregisterListener()
}

4. startUpdateFlowForResult参数冗余

使用IntentSenderForResultStarter时,UPDATE_REQUEST_CODE参数已无意义,可移除或设为0:

appUpdateManager.startUpdateFlowForResult(
    appUpdateInfo,
    AppUpdateType.FLEXIBLE,
    starter,
    0
)

5. 内部测试额外注意事项

  • 确认测试设备的Google账号已加入内部测试名单并接受邀请;
  • 上传测试包后需等待1-2小时,让Play商店缓存更新;
  • 检查versionCode而非versionName,应用内更新依赖versionCode判断版本高低;
  • 确保设备网络可正常访问Google Play服务。

内容的提问来源于stack exchange,提问作者A. Cedano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:32:45