简体   繁体   中英

Flexible in-app updates download in the foreground rather than the background

I have implemented flexible and immediate in-app update flows on my Android app. I fetch the update type from a remote server, and then use if-else to determine which update type to trigger. As of now, I am experiencing two issues.

  1. The flexible update is not providing a background download. Pressing the update button displays a full screen with download progress.
  2. The immediate update does not restart the app after installation. The user needs to manually open the app.

It is important to note that when I implement only the flexible flow, the flow will work correctly, and the background download will work while the user interacts with the app.

@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
    }
}

Removing the Immediate update listener from onResume() and moving it inside my custom checkForInAppUpdate method fixed my use case.

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();
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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