友盟在线参数+自动更新升级SDK实现指定版本强制更新升级

简介:

项目上有这样的需求:对指定的版本要求强制升级,同时其它的版本可以选择性升级。

友盟的自动更新功能还是挺好用的,只不过对强制升级这块支持的还不到位。

不过友盟的开发人员也给出了勉强可行的方案:

使用友盟在线参数来控制哪些版本需要强制更新,哪些版本不需要

相关的内容如下:

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);
            }


相关文章
|
3月前
|
存储 编解码 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C#)
37 0
|
5月前
|
API 开发工具
SDK版本问题
SDK版本问题
52 1
|
3月前
|
存储 编解码 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C++)
33 0
|
8月前
|
关系型数据库 MySQL 开发工具
使用OceanBase数据库中的ob_client mysql版本的SDK
使用OceanBase数据库中的ob_client mysql版本的SDK
137 1
|
3月前
|
开发工具 Android开发
Android获取SDK的版本信息
Android获取SDK的版本信息
39 0
|
5月前
|
开发工具
Queen智能美化特效SDK需要高级美颜、常见美型、美体这样是属于按版本买,还是按客户端计费?
Queen智能美化特效SDK需要高级美颜、常见美型、美体这样是属于按版本买,还是按客户端计费?
27 1
|
6月前
|
资源调度 Kubernetes Go
SchedulerX支持Go版本SDK
Go语言越来越流行,SchedulerX是阿里云的分布式任务调度服务,新增支持Go版本SDK
62 0
|
7月前
|
fastjson Java 开发工具
钉钉Stream SDK 默认使用的是 FastJSON 1.2.63 版本
钉钉Stream SDK 默认使用的是 FastJSON 1.2.63 版本
85 1
|
8月前
|
编解码 自动驾驶 API
Baumer工业相机堡盟工业相机如何使用新版本NEOAPI SDK控制相机数据流的开启和关闭(C++)
Baumer工业相机堡盟工业相机如何使用新版本NEOAPI SDK控制相机数据流的开启和关闭(C++)
75 0