项目上有这样的需求:对指定的版本要求强制升级,同时其它的版本可以选择性升级。
友盟的自动更新功能还是挺好用的,只不过对强制升级这块支持的还不到位。
不过友盟的开发人员也给出了勉强可行的方案:
使用友盟在线参数来控制哪些版本需要强制更新,哪些版本不需要
相关的内容如下:
1.在线参数配置:
http://dev.umeng.com/analytics/android/advanced-integration-guide#3
2.强制更新官方代码:
https://github.com/nxzhou91/umeng-android-sdk-theme/blob/master/blogs/articles/force_update.md
3.我的做法:
配置在线参数,参数值配置规则:版本号,强制更新标志,版本号,强制更新标志,版本号,强制更新标志...
关键代码:
private void prepare4UmengUpdate() {
MobclickAgent.updateOnlineConfig( MyApplication.getContext() );
//获取友盟在线参数
String update_mode = MobclickAgent.getConfigParams( MyApplication.getContext(), "upgrade_mode" );
Log.d(TAG, "MainActivity.prepare4UmengUpdate, update_mode = " + update_mode);
if(StringUtils.isEmpty(update_mode)) {
return;
}
//转换为数组
mUpdateModeArray = StringUtils.convertStrToArray(update_mode);
UmengUpdateAgent.setUpdateOnlyWifi(false); //在任意网络环境下都进行更新自动提醒
UmengUpdateAgent.update(this); //调用umeng更新接口
String curr_version_name = null;
try {
curr_version_name = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
}
catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int i=0; i<mUpdateModeArray.length; i+=2 ) {
if(StringUtils.isEquals(mUpdateModeArray[i], curr_version_name)) {
if(StringUtils.isEquals(mUpdateModeArray[i + 1], "F")) {
//对话框按键的监听,对于强制更新的版本,如果用户未选择更新的行为,关闭app
UmengUpdateAgent.setDialogListener(new UmengDialogButtonListener() {
@Override
public void onClick(int status) {
switch (status) {
case UpdateStatus.Update:
break;
default:
//友盟自动更新目前还没有提供在代码里面隐藏/显示更新对话框的
//"以后再说"按钮的方式,所以在这里弹个Toast比较合适
Toast.makeText(MyApplication.getContext(),
"非常抱歉,您需要更新应用才能继续使用", Toast.LENGTH_LONG).show();
}
}
});
}
break; //只要找到对应的版本号,即结束循环
}
}
}
另一种实现方式:
UmengUpdateAgent.setUpdateOnlyWifi(false);
String upgrade_mode = MobclickAgent.getConfigParams(this, "upgrade_mode");
if(TextUtils.isEmpty(upgrade_mode)){
return;
}
String[] upgrade_mode_array = upgrade_mode.split(";");
UmengUpdateAgent.setUpdateOnlyWifi(false);
UmengUpdateAgent.update(MainActivity.this);
UmengUpdateAgent.forceUpdate(MainActivity.this);//这行如果是强制更新就一定加上
for(String mode:upgrade_mode_array){
String versionName = ((MyApplication)getApplication()).getVersionName();
versionName = versionName + "f";
if(mode.equals(versionName)){
//进入强制更新
UmengUpdateAgent.setUpdateListener(new UmengUpdateListener() {
@Override
public void onUpdateReturned(int updateStatus, UpdateResponse updateResponse) {
}
});
UmengUpdateAgent.setDialogListener(new UmengDialogButtonListener() {
@Override
public void onClick(int status) {
switch (status) {
case UpdateStatus.Update:
break;
default:
//退出应用
MyApplication.base_logs.shortToast(getString(R.string.force_update_toast_string));
((MyApplication) getApplication()).AppExit(MainActivity.this);
}
}
});
break;
}
}
这里
UmengUpdateAgent.forceUpdate(MainActivity.this); 这行很重要,不加上这条,看看界面如何: 这里可以选择忽略改版,然后即使代码规定点击以后再说,也不会退出应用程序。 反过来加上这句代码看看界面如何:
这里没有忽略改版,然后点击以后再说,就会退出应用程序。
有网友反应说点击返回按钮后就不起效果,这里稍微做下修改,如下代码:
if(mode.equals(versionName)){
UmengUpdateAgent.forceUpdate(this);//这行如果是强制更新就一定加上
// 强制更新
UmengUpdateAgent.setDialogListener(new UmengDialogButtonListener() {
@Override
public void onClick(int status) {
switch (status) {
case UpdateStatus.Update:
break;
default:
// close the app
AppToast.showShortText(MainUIActivity.this, "非常抱歉,您需要更新应用才能继续使用");
MainUIActivity.this.finish();
}
}
});
break;
}else {
UmengUpdateAgent.update(this);
}