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

使用ActivityResultContracts时应用内更新的替代实现方案是什么

基于ActivityResultContracts实现应用内更新的方案

你可以通过封装自定义ActivityResultContract的方式替换旧的onActivityResult逻辑,完整实现步骤如下:

1. 定义应用内更新专属Contract

继承ActivityResultContract封装更新请求和结果解析逻辑:

class AppUpdateContract : ActivityResultContract<AppUpdateInfo, Int>() {
    override fun createIntent(context: Context, input: AppUpdateInfo): Intent {
        val updateManager = AppUpdateManagerFactory.create(context)
        // 这里的请求码仅为适配旧API,Contract会自动处理请求码匹配逻辑无需手动维护
        return updateManager.startUpdateFlowForResult(
            input,
            input.clientVersionStalenessDays ?: 0,
            context as Activity,
            1001
        ).intent
    }

    override fun parseResult(resultCode: Int, intent: Intent?): Int {
        return resultCode
    }
}

2. 注册更新结果回调

在需要触发更新的Activity/Fragment中注册回调处理更新结果:

private val appUpdateLauncher = registerForActivityResult(AppUpdateContract()) { result ->
    when(result) {
        Activity.RESULT_OK -> {
            // 用户确认更新,灵活更新可在此处注册下载进度监听,即时更新会自动触发安装
        }
        Activity.RESULT_CANCELED -> {
            // 用户取消更新,按业务逻辑处理即可
        }
        InstallErrorCode.ERROR_INTERNAL_ERROR -> {
            // 更新出现内部错误,按需做重试或降级处理
        }
    }
}

3. 触发更新流程

检测到可用更新后调用launch方法触发更新即可:

val updateManager = AppUpdateManagerFactory.create(this)
updateManager.appUpdateInfo.addOnSuccessListener { updateInfo ->
    if (updateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE 
        && updateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)
    ) {
        appUpdateLauncher.launch(updateInfo)
    }
}

注意:灵活更新的下载进度、安装状态监听不需要适配ActivityResult逻辑,直接沿用官方提供的InstallStateUpdatedListener接口实现即可,和旧版使用逻辑完全一致。

内容的提问来源于stack exchange,提问作者Christopher Myers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:15:05