项目上有这样的需求:对指定的版本要求强制升级,同时其它的版本可以选择性升级。
友盟的自动更新功能还是挺好用的,只不过对强制升级这块支持的还不到位。
不过友盟的开发人员也给出了勉强可行的方案:
使用友盟在线参数来控制哪些版本需要强制更新,哪些版本不需要
相关的内容如下:
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); }