![](/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.