簡體   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