Android应用内更新失效:适配onActivityResult弃用后仍无法工作
Android应用内更新功能故障排查
我想要实现Android In-App Update功能,但代码提示调用onActivityResult已被弃用。我参考相关方案修改后,以下是MainActivity中的代码:
private val updateFlowResultLauncher = registerForActivityResult( ActivityResultContracts.StartIntentSenderForResult(), ) { result -> if (result.resultCode == RESULT_OK) { // Handle successful app update } } private fun checkAppUpdate() { val starter = IntentSenderForResultStarter { intent, _, fillInIntent, flagsMask, flagsValues, _, _ -> val request = IntentSenderRequest.Builder(intent) .setFillInIntent(fillInIntent) .setFlags(flagsValues, flagsMask) .build() updateFlowResultLauncher.launch(request) } appUpdateManager = AppUpdateManagerFactory.create(this) appUpdateManager.registerListener(installStateUpdatedListener) val appUpdateInfoTask = appUpdateManager.appUpdateInfo appUpdateInfoTask.addOnSuccessListener { appUpdateInfo: AppUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE) ) { try { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.FLEXIBLE, starter, UPDATE_REQUEST_CODE ) } catch (e: SendIntentException) { e.printStackTrace() } } } } private fun checkNewAppVersionState() { appUpdateManager .appUpdateInfo .addOnSuccessListener { appUpdateInfo: AppUpdateInfo -> if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) { popupAlerter() } } } private fun popupAlerter() { val snackbar = Snackbar.make( findViewById(android.R.id.content), "Nueva versión descargada, por favor reinicia", Snackbar.LENGTH_INDEFINITE ) snackbar.setAction("REINICIAR") { view: View? -> appUpdateManager.completeUpdate() } snackbar.setActionTextColor( ContextCompat.getColor(this, R.color.colorAccent) ) snackbar.show() } private fun unregisterListener() { appUpdateManager.unregisterListener( installStateUpdatedListener ) }
我上传了版本号低于Play商店已发布版本的内部测试包,但更新功能仍无法正常工作。请问我的代码存在什么问题?
代码问题及修复建议
1. 缺失installStateUpdatedListener具体实现
你注册了installStateUpdatedListener但未提供实现逻辑,导致无法监听更新状态变化(如下载完成、安装失败)。补充实现:
private val installStateUpdatedListener = InstallStateUpdatedListener { state -> when (state.installStatus()) { InstallStatus.DOWNLOADED -> popupAlerter() InstallStatus.FAILED -> { // 处理更新失败逻辑,比如提示用户重试 } else -> {} } }
2. checkNewAppVersionState未触发
当前代码没有调用checkNewAppVersionState方法,应用启动或从后台返回时,无法检测是否有已下载完成的更新等待安装。建议在onResume中添加调用:
override fun onResume() { super.onResume() checkNewAppVersionState() }
3. 监听器注销时机缺失
需在Activity销毁时注销监听器,避免内存泄漏,在onDestroy中调用:
override fun onDestroy() { super.onDestroy() unregisterListener() }
4. startUpdateFlowForResult参数冗余
使用IntentSenderForResultStarter时,UPDATE_REQUEST_CODE参数已无意义,可移除或设为0:
appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.FLEXIBLE, starter, 0 )
5. 内部测试额外注意事项
- 确认测试设备的Google账号已加入内部测试名单并接受邀请;
- 上传测试包后需等待1-2小时,让Play商店缓存更新;
- 检查
versionCode而非versionName,应用内更新依赖versionCode判断版本高低; - 确保设备网络可正常访问Google Play服务。
内容的提问来源于stack exchange,提问作者A. Cedano
相关产品推荐
相关产品推荐

