友盟在线参数+自动更新升级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.我的做法:

配置在线参数,参数值配置规则:版本号,强制更新标志,版本号,强制更新标志,版本号,强制更新标志...

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

关键代码:

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;  //只要找到对应的版本号,即结束循环  
            }  
        }  
  
    }  


另一种实现方式:

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

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


上一篇:Oracle 10.2.0.5 非归档current redolog损坏处理一例


下一篇:ClickHouse内核分析-ZooKeeper在分布式集群中的作用以及ReplicatedMergeTree表引擎的实现