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

