標籤:blank 忘記 sid layout page upd type res tool
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啟動頁面實現版本檢查更新