1. 程式人生 > >Android啟動頁面實現版本檢查更新

Android啟動頁面實現版本檢查更新

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啟動頁面實現版本檢查更新