InAppUpdate已弃用:如何解决activityResultLauncher相关问题?
解决InAppUpdate中activityResultLauncher的使用问题
1. 注册ActivityResultLauncher
在你的Activity或Fragment中,先注册用于接收应用更新结果的ActivityResultLauncher,使用ActivityResultContracts.StartIntentSenderForResult()适配AppUpdate的启动需求:
// 在Activity类中定义全局变量 private lateinit var appUpdateResultLauncher: ActivityResultLauncher<IntentSenderRequest> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化Launcher并处理更新结果 appUpdateResultLauncher = registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result -> when (result.resultCode) { RESULT_OK -> { // 更新成功完成,可执行重启应用、提示用户等后续操作 } RESULT_CANCELED -> { // 用户主动取消更新 } ActivityResult.RESULT_IN_APP_UPDATE_FAILED -> { // 更新失败,可选择重试或给用户提示 } } } // 触发应用更新检查 checkForAvailableUpdate() }
2. 配合AppUpdateManager启动更新流程
检查到可用更新后,将注册好的Launcher传入新的更新方法,替代已弃用的startUpdateFlowForResult逻辑:
private fun checkForAvailableUpdate() { val appUpdateManager = AppUpdateManagerFactory.create(this) val appUpdateInfoTask = appUpdateManager.appUpdateInfo appUpdateInfoTask.addOnSuccessListener { appUpdateInfo -> // 处理立即更新场景 if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) ) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, appUpdateResultLauncher, AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE).build() ) } // 处理灵活更新场景 else if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE) ) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, appUpdateResultLauncher, AppUpdateOptions.newBuilder(AppUpdateType.FLEXIBLE).build() ) } } }
关键注意点
- 必须在
onCreate生命周期内完成Launcher注册,避免因生命周期时序问题导致无法接收结果。 - 灵活更新需额外监听更新状态,在下载安装完成后调用
appUpdateManager.completeUpdate()完成最终更新流程。 - 需覆盖更新不可用、用户拒绝更新等异常场景,优化用户体验。
内容的提问来源于stack exchange,提问作者taolao
相关产品推荐
相关产品推荐

