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

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.