android 版本更新页面,Android启动页面实现版本检查更新

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(Stringjson) {

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, longtotalLength) {

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,StringimageUrl) {

view.setScaleType(ImageView.ScaleType.FIT_XY);

Glide.with(this).load(imageUrl).into(view);

}

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

//设置弹窗内容

privateCheckUpdateOption generateOption(UpGradeBean mbean) {return newCheckUpdateOption.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 intgetVersion(Context context) {int version = 0;try{

version=context.getPackageManager().getPackageInfo(

context.getPackageName(),0).versionCode;

}catch(Exception e) {

System.out.println("获取版本号异常!");

}returnversion;

}//获取APP版本名

publicString getVersionName(Context context) {

String versionName= null;try{

versionName=context.getPackageManager().getPackageInfo(

context.getPackageName(),0).versionName;

}catch(Exception e) {

System.out.println("获取版本名异常!");

}returnversionName;

}/*** 比较版本号的大小

* 前者大则返回一个正数

* 后者大返回一个负数

* 相等则返回0

*@paramversion1 前者

*@paramversion2 后者

*@return

*/

public static intcompareVersion(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

&& (diff = versionArray1[idx].compareTo(versionArray2[idx])) == 0) {//再比较字符

++idx;

}//如果已经分出大小,则直接返回,如果未分出大小,则再比较位数,有子版本的为大;

diff = (diff != 0) ? diff : versionArray1.length -versionArray2.length;returndiff;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值