如何使用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
相关产品推荐
相关产品推荐

