繁体   English   中英

灵活的应用内更新在前台而不是后台下载

[英]Flexible in-app updates download in the foreground rather than the background

我在我的 Android 应用程序上实现了灵活且即时的应用程序内更新流程。 我从远程服务器获取更新类型,然后使用 if-else 确定要触发的更新类型。 到目前为止,我遇到了两个问题。

  1. 灵活更新不提供后台下载。 按下更新按钮将全屏显示下载进度。
  2. 立即更新不会在安装后重新启动应用程序。 用户需要手动打开应用程序。

需要注意的是,当我只实现灵活的流程时,流程将正常工作,并且在用户与应用程序交互时后台下载将工作。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    checkForInAppUpdate();
}
private void checkForInAppUpdate() {
    try {
        appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
            if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE) {
                if (triggerUpdate
                        && appUpdateInfo.updatePriority() > 3
                        && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
                    requestImmediateUpdate(appUpdateInfo);
                } else if (triggerUpdate
                        && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
                    requestFlexibleUpdate(appUpdateInfo);
                }
            }
        });

        appUpdateInfoTask.addOnFailureListener(Throwable::printStackTrace);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
private void requestFlexibleUpdate(AppUpdateInfo appUpdateInfo) {
    try {
        appUpdateManager.startUpdateFlowForResult(
                appUpdateInfo,
                AppUpdateType.FLEXIBLE,
                this,
                FLEXIBLE_UPDATE_CODE);
    } catch (IntentSender.SendIntentException e) {
        e.printStackTrace();
    }
}
private void requestImmediateUpdate(AppUpdateInfo appUpdateInfo) {
    try {
        appUpdateManager.startUpdateFlowForResult(
                appUpdateInfo,
                AppUpdateType.IMMEDIATE,
                this,
                IMMEDIATE_UPDATE_CODE);
    } catch (IntentSender.SendIntentException e) {
        e.printStackTrace();
    }
}
@Override
protected void onResume() {
    super.onResume();

    appUpdateManager.getAppUpdateInfo().addOnSuccessListener(appUpdateInfo -> {
        if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
            // If an in-app update is already running, resume the update.
            requestImmediateUpdate(appUpdateInfo);
        }
    });
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == IMMEDIATE_UPDATE_CODE && resultCode != RESULT_OK) {
        checkForInAppUpdate(); // if in any case update request is cancelled and failed
    }
}

从 onResume() 中删除即时更新侦听器并将其移动到我的自定义 checkForInAppUpdate 方法中修复了我的用例。

private void checkForInAppUpdate() {
    try {
        appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
            if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE) {
                if (triggerUpdate
                        && appUpdateInfo.updatePriority() > 3
                        && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
                    requestUpdate(appUpdateInfo, AppUpdateType.IMMEDIATE);
                } else if (triggerUpdate
                        && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
                    requestUpdate(appUpdateInfo, AppUpdateType.FLEXIBLE);
                } else if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
                    requestUpdate(appUpdateInfo, AppUpdateType.IMMEDIATE);
                }
            }
        });

        appUpdateInfoTask.addOnFailureListener(Throwable::printStackTrace);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM