幽沉谢世事,俯默窥唐虞。这篇文章主要讲述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 datahttps://www.songbingjia.com/android/= ""; try { JSONObject jsonObj = JSON.parseObject(json); code = jsonObj.getString("code"); msg = jsonObj.getString("msg"); data = https://www.songbingjia.com/android/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); }
【Android启动页面实现版本检查更新】关键代码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; }
推荐阅读
- Invalid bound statement (not found): com.ros.dao.LogMapper.insert
- Android查缺补漏(线程篇)-- AsyncTask的使用及原理详细分析
- 跨平台 webapp 开发技术之 Hybrid App
- 学习Android
- 转载Android Bug分析系列(第三方平台安装app启动后,home键回到桌面后点击app启动时会再次启动入口类bug的原因剖析)
- react-native App的原理介绍
- 修改this指向(bindcall 和 apply)
- 仅仅通过Application监听用户行为及App的在线状态和在线时长
- Android使用OKHttp库实现视频文件的上传到服务器