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

如何使用registerForActivityResult获取应用内更新结果 适配Jetpack Compose

适配Jetpack Compose的应用内更新registerForActivityResult实现方案

完全替代废弃的onActivityResult方案,所有逻辑可在Composable作用域内完成,无需在Activity层额外编码

1. 依赖确认

确保模块级build.gradle已引入以下核心依赖:

// 应用内更新核心依赖
implementation "com.google.android.play:app-update:2.1.0"
implementation "com.google.android.play:app-update-ktx:2.1.0"
// Compose Activity 已包含Activity Result核心组件,版本不低于1.4.0即可
implementation "androidx.activity:activity-compose:1.7.2"

2. Compose侧注册结果回调

直接使用Compose提供的rememberLauncherForActivityResultAPI注册更新结果回调,无需在Activity中声明:

@Composable
fun AppUpdateScreen() {
    val context = LocalContext.current
    val appUpdateManager = remember { AppUpdateManagerFactory.create(context) }
    
    // 注册应用内更新结果回调
    val updateLauncher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.StartIntentSenderForResult(),
        onResult = { result ->
            when(result.resultCode) {
                Activity.RESULT_OK -> {
                    // 用户已同意更新,即时更新会自动开始安装,灵活更新可后续监听下载状态
                    Toast.makeText(context, "更新已启动", Toast.LENGTH_SHORT).show()
                }
                Activity.RESULT_CANCELED -> {
                    // 用户取消更新,可根据业务逻辑处理,比如即时更新场景下直接退出应用
                    Toast.makeText(context, "更新已取消", Toast.LENGTH_SHORT).show()
                }
                ActivityResult.RESULT_IN_APP_UPDATE_FAILED -> {
                    // 更新流程出错,可重试
                    Toast.makeText(context, "更新失败,请稍后重试", Toast.LENGTH_SHORT).show()
                }
            }
        }
    )

    // 页面启动时触发更新检查
    LaunchedEffect(Unit) {
        checkForAppUpdate(appUpdateManager, updateLauncher, context)
    }

    // 页面其余内容
    Text(text = "应用首页")
}

3. 实现更新检查与启动逻辑

封装更新检查方法,符合官方的状态校验规则:

private suspend fun checkForAppUpdate(
    appUpdateManager: AppUpdateManager,
    updateLauncher: ActivityResultLauncher<IntentSenderRequest>,
    context: Context
) {
    val appUpdateInfoTask = appUpdateManager.appUpdateInfo
    appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
        // 判断更新是否可用,以及更新优先级是否符合要求
        val isUpdateAvailable = appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
        // 这里演示即时更新,如需灵活更新改为AppUpdateType.FLEXIBLE即可
        val isUpdateAllowed = appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)

        if (isUpdateAvailable && isUpdateAllowed) {
            // 构造启动请求
            val intentSenderRequest = IntentSenderRequest.Builder(
                appUpdateInfo.intentSenderForResult(
                    context as Activity,
                    1001, // 请求码可任意填写,此处不会和其他请求冲突
                    null,
                    0,
                    0,
                    0
                )
            ).build()
            // 启动更新流程
            updateLauncher.launch(intentSenderRequest)
        }
    }.addOnFailureListener {
        // 更新检查失败处理
        it.printStackTrace()
    }
}

4. 额外场景处理

  • 灵活更新场景:可通过appUpdateManager.registerListener监听下载进度,下载完成后调用appUpdateManager.completeUpdate()触发安装
  • 页面重建状态保留:可将更新状态存入ViewModel,避免配置变更导致重复检查更新
  • 后台切回校验:可在LaunchedEffect中添加生命周期监听,切回前台时再次检查更新是否被中断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:15:05