博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android启动页面实现版本检查更新
阅读量:6881 次
发布时间:2019-06-27

本文共 8095 字,大约阅读时间需要 26 分钟。

1、引入模块

CheckUpdateLibrary的github地址如下:

打包下载,复制该文件下的两个文件夹到项目的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
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,记得修改包名字

2、添加apk_uri_grant.xml

 

 

转载于:https://www.cnblogs.com/jsben/p/8531683.html

你可能感兴趣的文章
CSS 你到底有多少长度单位?
查看>>
Linux Shell脚本系列之二
查看>>
设计模式--代理模式(Proxy Pattern)
查看>>
稀疏数组
查看>>
HTML5 标签 canvas
查看>>
react-router@4.0 使用方法和源码分析
查看>>
Flutter简介
查看>>
组织级敏捷转型的四个阶段
查看>>
「数据游戏」:使用 LSTM 模型预测三天后单股收盘价
查看>>
vuex持久化插件-解决浏览器刷新数据消失问题
查看>>
Vue-cli3 项目在安卓低版本系统和 IE 上白屏问题解决
查看>>
并发-7-同步容器和ConcurrentHashMap
查看>>
React安装:
查看>>
从0开始搭建微信小程序(前后端)的全过程
查看>>
小程序如何生成海报分享朋友圈
查看>>
检测后台错误
查看>>
微信小程序自定义组件
查看>>
Android Studio 和 Gradle 优化配置总结
查看>>
java8 stream实现列表去重,java8的stream 和lambda的使用实例
查看>>
iOS中通知的添加和移除
查看>>