zoukankan      html  css  js  c++  java
  • Android启动页面实现版本检查更新

    1、引入模块

    CheckUpdateLibrary的github地址如下:

    https://github.com/qiangxi/CheckUpdateLibrary

    打包下载,复制该文件下的两个文件夹到项目的extras文件夹下,

    项目setting.gradle里面加入这两个模块。

    include ':app',
            ':extras:okhttputils',
            ':extras:FlycoTabLayout_Lib',
            ':extras:ViewPagerIndicator_library',
            ':extras:checkupdatelib',
            ':extras:annotation'
    app文件夹下build.gradle中加入
    compile project(':extras:annotation')
    compile project(':extras:checkupdatelib')
    然后把gradle的 sync now一下,如果提示GBK编码错误,在app文件夹下build.gradle中加入

    //结果GBK报错的问题
    tasks.withType(JavaCompile) {
        options.encoding = "UTF-8"
    }
    如果仍然报错,把checkupdatelib,annotation两个文件夹下build.gradle中也加入这个。

    这样,引入模块的工作已经完成。PS:这个东东的作者有点懒,可能也是比较忙,可能忘记把包上传。哈哈。所以大家还是要关注他的GITHUB。

    2、关键代码
    服务端下发的version.json
    {
    "code":"200",
    "msg":"success",
    "data":{
    "appname":"teset",
    "filename":"skpda",
    "filepath":"/demo.apk",
    "imageurl":"http://skpda.xxx.com/version/1520427805_108185.png",
    "isforceupdate":"true",
    "newappsize":"4",
    "newappupdatedesc":"1.更新内容1/n2.更新内容23.更新内容3",
    "newappurl":"http://skpda.xxx.com/version/app-debug.apk",
    "newappversionname":"3.0",
    "notificationsuccesscontent":"提示成功",
    "notificationfailurecontent":"提示失败",
    "notificationiconresid":"",
    "notificationtitle":"APP有更新了"
    }}

    插一句,这个里面主要是本地取版本的versionname和服务器上取到的versionname进行比较,如果本地的比远程的值小那么就要进行更新提示。

    关键代码1、import内容

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.bumptech.glide.Glide;
    import com.qiangxi.checkupdatelibrary.CheckUpdateOption;
    import com.qiangxi.checkupdatelibrary.callback.DownloadCallback;
    import com.qiangxi.checkupdatelibrary.callback.StringCallback;
    import com.qiangxi.checkupdatelibrary.imageloader.ImageLoader;
    import com.qiangxi.checkupdatelibrary.utils.L;

    关键代码2、一是窗体必须是AppCompatActivity,二是要引入这个模块提供的几个接口,StringCallback, DownloadCallback, ImageLoader

    public class SplashActivity extends AppCompatActivity implements StringCallback, DownloadCallback, ImageLoader {.....}

    关键代码3、业务函数-----执行这个功能的入口

        public void checkUpdate(View view) {
            Map<String, String> params = new HashMap<>();
    //        params.put("key", "cacfae015af2ff98ce235bf4c5a4c662");//测试通过
            //get请求
    //        Q.get(API, params).callback(this).execute();//测试通过
            //直接下载
    //        Q.download(DOWNLOAD, PATH, NAME).execute();//测试通过
            //演示
    //        Q.show(this, generateOption(), this);//测试通过
            //post请求
    //        Q.post(API, params).callback(this).execute();
    //       放入请求地址和参数
            Q.get(Constants.UPGRADE_API, params).callback(this).execute();//测试通过
        }

    关键代码4、这个activity中要重写几个接口提供的方法

        @Override   //检查版本开始执行内容
        public void checkUpdateStart() {
            L.e("checkUpdateStart...+Thread=" + Thread.currentThread());
        }
    
        @Override   //检查版本执行失败执行内容
        public void checkUpdateFailure(Throwable t) {
            L.e("checkUpdateFailure...+t=" + t.toString() + ",thread=" + Thread.currentThread());
        }
    
        @Override   //检查版本执行检查执行内容
        public void checkUpdateFinish() {
            L.e("checkUpdateFinish...+Thread=" + Thread.currentThread());
        }
    
        @Override    //检查版本成功,获取到服务器中返回的JSON信息,解析JSON,开始下一步操作,也就是弹出更新的提示窗口
        public void checkUpdateSuccess(String json) {
            L.e("checkUpdateSuccess...+json=" + json + ",thread=" + Thread.currentThread());
            String code = "";
            String msg = "";
            String data = "";
            try {
                JSONObject jsonObj = JSON.parseObject(json);
                code = jsonObj.getString("code");
                msg = jsonObj.getString("msg");
                data = jsonObj.getString("data");
            } catch (Exception e) {
                Toast.makeText(SplashActivity.this, "服务器发生通讯错误信息:" + msg, Toast.LENGTH_SHORT).show();
            }
            if (!code.equals("200")) {
                Toast.makeText(SplashActivity.this, "服务器发生错误信息:" + msg, Toast.LENGTH_SHORT).show();
            } else {
                UpGradeBean bean = JSON.parseObject(data, UpGradeBean.class);
                String remoteVersionName = bean.getNewappversionName();
    
                String localVersionName = (new UpGradeTool()).getVersionName(this);
                String localVersionCode = Integer.toString((new UpGradeTool()).getVersion(this));
    
                Log.e("本地版本名字", localVersionName);
                Log.e("本地版本号", localVersionCode);
                Log.e("远程版本名字", remoteVersionName);
    
                int flag = UpGradeTool.compareVersion(remoteVersionName, localVersionName);//比较本地和远程版本
                Log.e("比较结果", "checkUpdateSuccess: " + flag);
                if (flag > 0) {
                    Q.show(this, generateOption(bean), SplashActivity.this);//测试通过generateOption(bean);
                } else {
                    isVersion = true;//设置版本检查工作执行结束标志
                    startLogin(); //执行是否进入下一项工作的入口
                }
            }
        }
    
        //下载成功的执行内容
        @Override
        public void downloadProgress(long currentLength, long totalLength) {
            L.e("downloadProgress...+currentLength=" + currentLength + ",totalLength=" + totalLength + ",thread=" + Thread.currentThread());
        }
    
        //下载失败的执行内容
        @Override
        public void downloadSuccess(File apk) {
            L.e("downloadSuccess...+apk.size=" + apk.length() + ",thread=" + Thread.currentThread());
    
        }
    
        //设置图片
        @Override
        public void loadImage(ImageView view, String imageUrl) {
            view.setScaleType(ImageView.ScaleType.FIT_XY);
            Glide.with(this).load(imageUrl).into(view);
        }

    关键代码5、构造更新提示弹窗的选项

     //设置弹窗内容
        private CheckUpdateOption generateOption(UpGradeBean mbean) {
            return new CheckUpdateOption.Builder()
                    .setAppName(mbean.getAppname())
                    .setFileName("/" + Constants.UPGRADE_NAME)
                    .setFilePath(Constants.UPGRADE_FILE_PATH)
                    .setImageUrl(mbean.getImageurl())
                    .setIsForceUpdate(mbean.getForce())
                    .setNewAppSize(mbean.getFloatNewAPPSize())
                    .setNewAppUpdateDesc(mbean.getNewappupdateDesc())
                    .setNewAppUrl(mbean.getNewappurl())
                    .setNewAppVersionName(mbean.getNewappversionName())
                    .setNotificationSuccessContent(mbean.getNotificationsuccesscontent())
                    .setNotificationFailureContent(mbean.getNotificationfailurecontent())
                    .setNotificationIconResId(R.mipmap.ic_launcher)
                    .setNotificationTitle(mbean.getNotificationtitle())
                    .build();
        }
    这样基本就完成了。
    补充三个函数:获取APP本地版本号,版本名,比较两个版本名
      //获取APP版本号
        public int getVersion(Context context) {
            int version = 0;
            try {
                version = context.getPackageManager().getPackageInfo(
                        context.getPackageName(), 0).versionCode;
            } catch (Exception e) {
                System.out.println("获取版本号异常!");
            }
            return version;
        }
    
        //获取APP版本名
        public String getVersionName(Context context) {
            String versionName = null;
            try {
                versionName = context.getPackageManager().getPackageInfo(
                        context.getPackageName(), 0).versionName;
            } catch (Exception e) {
                System.out.println("获取版本名异常!");
            }
            return versionName;
        }
    
    
        /**
         * 比较版本号的大小
         *  前者大则返回一个正数
         *  后者大返回一个负数
         *  相等则返回0
         * @param version1 前者
         * @param version2 后者
         * @return
         */
        public static int compareVersion(String version1, String version2){
            if (version1 == null || version2 == null) {
                throw new RuntimeException("版本号不能为空");
            }
            String[] versionArray1 = version1.split("\.");//注意此处为正则匹配,不能用.;
            String[] versionArray2 = version2.split("\.");
            int idx = 0;
            int minLength = Math.min(versionArray1.length, versionArray2.length);//取最小长度值
            int diff = 0;
            while (idx < minLength
                    && (diff = versionArray1[idx].length() - versionArray2[idx].length()) == 0//先比较长度
                    && (diff = versionArray1[idx].compareTo(versionArray2[idx])) == 0) {//再比较字符
                ++idx;
            }
            //如果已经分出大小,则直接返回,如果未分出大小,则再比较位数,有子版本的为大;
            diff = (diff != 0) ? diff : versionArray1.length - versionArray2.length;
            return diff;
        }

    注意修改:
    1、APP的配置
    注意,应参考该开源包中提供的sample修改AndroidMainfest.xml中的配置,添加provider,记得修改包名字
            <provider
                android:name="android.support.v4.content.FileProvider"
                android:authorities="com.sk.pda.provider.FileProvider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/apk_uri_grant"/>
            </provider>

    2、添加apk_uri_grant.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <paths>
            <external-path
                name="checkupdate"
                path=""/>
            <files-path
                name="checkupdate"
                path=""/>
            <cache-path
                name="checkupdate"
                path=""/>
            <root-path
                name="checkupdate"
                path=""/>
        </paths>
    </resources>



  • 相关阅读:
    postman使用详解
    如何测试一个水杯
    selenium3(java)之屏幕截图操作
    C语言随机点名程序
    关于测试执行的一些总结与思考
    小议SQL数据插入
    BS架构和CS架构的区别
    Oracle伪列(ROWNUM)的使用
    Loadrunner学习资料
    【Apache运维基础(2)】主配置文件说明
  • 原文地址:https://www.cnblogs.com/jsben/p/8531683.html
Copyright © 2011-2022 走看看