![](/img/trans.png)
[英]How to mark app update as Immediate, or Flexible(in-app updates API)
[英]Flexible in-app updates download in the foreground rather than the background
我在我的 Android 應用程序上實現了靈活且即時的應用程序內更新流程。 我從遠程服務器獲取更新類型,然后使用 if-else 確定要觸發的更新類型。 到目前為止,我遇到了兩個問題。
需要注意的是,當我只實現靈活的流程時,流程將正常工作,並且在用戶與應用程序交互時后台下載將工作。
@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.