Android啟動頁面實現版本檢查更新
阿新 • • 發佈:2018-03-09
res show execute 獲取app版本號 fly ppc imageload apk LV
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; }
Android啟動頁面實現版本檢查更新