Android应用Flexible内更新前台下载异常及Immediate更新重启问题
Android应用内更新问题解决方案
问题1:Flexible更新无法后台下载,触发后显示全屏进度界面
你的代码中onResume方法存在逻辑错误:当检测到DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS时,无论当前是哪种更新类型,都调用了requestImmediateUpdate,这会把正在进行的Flexible更新强制转为Immediate更新,导致后台下载失效,出现全屏进度界面。
修复方法:在onResume中判断当前更新类型,对应恢复流程:
@Override protected void onResume() { super.onResume(); appUpdateManager.getAppUpdateInfo().addOnSuccessListener(appUpdateInfo -> { if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) { // 根据当前更新类型恢复对应流程 if (appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) { requestImmediateUpdate(appUpdateInfo); } else if (appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) { requestFlexibleUpdate(appUpdateInfo); } } }); }
同时,为Flexible更新注册状态监听器,监听下载进度与完成状态:
private InstallStateUpdatedListener installStateUpdatedListener = state -> { if (state.installStatus() == InstallStatus.DOWNLOADED) { // 下载完成后提示用户触发安装 showPostUpdateInstallPrompt(); } }; @Override protected void onStart() { super.onStart(); appUpdateManager.registerListener(installStateUpdatedListener); } @Override protected void onStop() { super.onStop(); appUpdateManager.unregisterListener(installStateUpdatedListener); }
问题2:Immediate更新安装完成后不自动重启应用
Immediate更新默认不会自动重启应用,需通过监听系统广播实现安装完成后的自动重启:
- 实现广播接收器:
public class UpdateCompleteReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_PACKAGE_REPLACED.equals(intent.getAction())) { String updatedPackage = intent.getData().getSchemeSpecificPart(); if (context.getPackageName().equals(updatedPackage)) { // 重启应用 Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(updatedPackage); if (launchIntent != null) { launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(launchIntent); } } } } }
- 动态注册接收器(适配Android 8.0及以上版本,静态注册无法接收该广播):
private UpdateCompleteReceiver updateReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); registerUpdateReceiver(); checkForInAppUpdate(); } private void registerUpdateReceiver() { updateReceiver = new UpdateCompleteReceiver(); IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_REPLACED); filter.addDataScheme("package"); registerReceiver(updateReceiver, filter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(updateReceiver); }
内容的提问来源于stack exchange,提问作者amo
相关产品推荐
相关产品推荐

