Android 版本更新(自定義接口協議)

項目地址「AppUpdateDemo

Android 版本更新

目錄

功能介紹

  • [x] 實現app版本更新
  • [x] 自定義接口協議,可以不改變現有項目的協議就能使用
  • [x] 支持get,post請求
  • [x] 支持進度顯示,對話框進度條,和通知欄進度條展示
  • [x] 支持后臺下載
  • [x] 支持強制更新
  • [x] 支持簡單主題色配置(可以自動從頂部圖片提取主色)
  • [x] 完美支持android7.0

效果圖與示例 apk

點擊下載 Demo.apk 或掃描下面的二維碼安裝

Demo apk文件二維

Gradle 依賴

dependencies {
    compile 'com.qianwen:update-app:3.2.3'
}

API
API
License
License

自定義接口協議

自定義接口協議,根據自己項目的接口,自己實現 parseJson 方法


        Map<String, String> params = new HashMap<String, String>();

        params.put("key1", "value1");
        params.put("key2", "value2");
        params.put("key3", "value3");
        params.put("key4", "value4");


        new UpdateAppManager
                .Builder()
                //當前Activity
                .setActivity(this)
                //實現httpManager接口的對象
                .setHttpManager(new UpdateAppHttpUtil())
                //設置請求方式 默認get,
                .setPost(false)
                //更新地址
                .setUpdateUrl("https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/json/json.txt")
                //添加自定義參數
                .setParams(params)
                //設置頭部
                .setTopPic(R.mipmap.top_5)
                //設置主題色
                .setThemeColor(0xff034ea0)
                .build()
                //檢測是否有新版本
                .checkNewApp(new UpdateCallback() {
                    /**
                     * 解析json,自定義協議
                     *
                     * @param json 服務器返回的json
                     * @return UpdateAppBean
                     */
                    @Override
                    protected UpdateAppBean parseJson(String json) {
                        UpdateAppBean updateAppBean = new UpdateAppBean();
                        try {
                            JSONObject jsonObject = new JSONObject(json);
                            updateAppBean
                                    //是否更新Yes,No
                                    .setUpdate(jsonObject.getString("update"))
                                    //新版本號
                                    .setNew_version(jsonObject.getString("new_version"))
                                    //下載地址
                                    .setApk_file_url(jsonObject.getString("apk_file_url"))
                                    //大小
                                    .setTarget_size(jsonObject.getString("target_size"))
                                    //更新內容
                                    .setUpdate_log(jsonObject.getString("update_log"))
                                    //是否強制更新
                                    .setConstraint(jsonObject.getBoolean("constraint"));
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        return updateAppBean;
                    }

                    /**
                     * 有新版本
                     *
                     * @param updateApp        新版本信息
                     * @param updateAppManager app更新管理器
                     */
                    @Override
                    public void hasNewApp(UpdateAppBean updateApp, UpdateAppManager updateAppManager) {
                        updateAppManager.showDialog();
                    }

                    /**
                     * 網絡請求之前
                     */
                    @Override
                    public void onBefore() {
                        CProgressDialogUtils.showProgressDialog(MainActivity.this);
                    }

                    /**
                     * 網路請求之后
                     */
                    @Override
                    public void onAfter() {
                        CProgressDialogUtils.cancelProgressDialog(MainActivity.this);
                    }

                    /**
                     * 沒有新版本
                     */
                    @Override
                    public void noNewApp() {
                        Toast.makeText(MainActivity.this, "沒有新版本", Toast.LENGTH_SHORT).show();
                    }
                });


使用默認的接口協議

接口說明

1,和服務器交互請求參數

1,appkey app的唯一標志
appkey可以在manifest文件中配置,也可以在代碼中添加
xml配置如下:

  <meta-data
            android:name="UPDATE_APP_KEY"
            android:value="ab55ce55Ac4bcP408cPb8c1Aaeac179c5f6f"/>

2,version 版本號,工具自動添加(服務器判斷客戶端傳過來的version和服務器存的最新的version,決定是否更新)

3, 服務器app后臺管理界面(下次放出服務器的代碼)

2, 服務器的返回json格式

1,有新版本

{
  "update": "Yes",//有新版本
  "new_version": "0.8.3",//新版本號
  "apk_file_url": "https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/apk/app-debug.apk", //apk下載地址
  "update_log": "1,添加刪除信用卡接口\r\n2,添加vip認證\r\n3,區分自定義消費,一個小時不限制。\r\n4,添加放棄任務接口,小時內不生成。\r\n5,消費任務手動生成。",//更新內容
  "target_size": "5M",//apk大小
  "constraint": false//是否強制更新
}

2,沒有新版本

{
  "update": "No",//沒有新版本
}

1,根據自己項目使用的網絡框架,自己實現HttpManager接口,


    class UpdateAppHttpUtil implements HttpManager {
        /**
         * 異步get
         *
         * @param url      get請求地址
         * @param params   get參數
         * @param callBack 回調
         */
        @Override
        public void asyncGet(@NonNull String url, @NonNull Map<String, String> params, @NonNull final Callback callBack) {
            OkHttpUtils.get()
                    .url(url)
                    .params(params)
                    .build()
                    .execute(new StringCallback() {
                        @Override
                        public void onError(Call call, Response response, Exception e, int id) {
                            callBack.onError(validateError(e, response));
                        }
    
                        @Override
                        public void onResponse(String response, int id) {
                            callBack.onResponse(response);
                        }
                    });
        }
    
        /**
         * 異步post
         *
         * @param url      post請求地址
         * @param params   post請求參數
         * @param callBack 回調
         */
        @Override
        public void asyncPost(@NonNull String url, @NonNull Map<String, String> params, @NonNull final Callback callBack) {
            OkHttpUtils.post()
                    .url(url)
                    .params(params)
                    .build()
                    .execute(new StringCallback() {
                        @Override
                        public void onError(Call call, Response response, Exception e, int id) {
                            callBack.onError(validateError(e, response));
                        }
    
                        @Override
                        public void onResponse(String response, int id) {
                            callBack.onResponse(response);
                        }
                    });
    
        }
    
        /**
         * 下載
         *
         * @param url      下載地址
         * @param path     文件保存路徑
         * @param fileName 文件名稱
         * @param callback 回調
         */
        @Override
        public void download(@NonNull String url, @NonNull String path, @NonNull String fileName, @NonNull final FileCallback callback) {
            OkHttpUtils.get()
                    .url(url)
                    .build()
                    .execute(new FileCallBack(path, fileName) {
                        @Override
                        public void inProgress(float progress, long total, int id) {
                            super.inProgress(progress, total, id);
                            callback.onProgress(progress, total);
                        }
    
                        @Override
                        public void onError(Call call, Response response, Exception e, int id) {
                            callback.onError(validateError(e, response));
                        }
    
                        @Override
                        public void onResponse(File response, int id) {
                            callback.onResponse(response);
    
                        }
    
                        @Override
                        public void onBefore(Request request, int id) {
                            super.onBefore(request, id);
                            callback.onBefore();
                        }
                    });
    
        }
    }

3,客戶端檢測是否有新版本,并且更新下載


    String updateUrl = "https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/json/json.txt";
    new UpdateAppManager
            .Builder()
            //當前Activity
            .setActivity(this)
            //實現httpManager接口的對象
            .setHttpManager(new UpdateAppHttpUtil())
            //更新地址
            .setUpdateUrl(updateUrl)
            .build()
            //檢測是否有新版本
            .checkNewApp(new UpdateCallback() {
                /**
                 * 有新版本
                 * @param updateApp 新版本信息
                 * @param updateAppManager app更新管理器
                 */
                @Override
                public void hasNewApp(UpdateAppBean updateApp, UpdateAppManager updateAppManager) {
                    updateAppManager.showDialog();
                }
    
                /**
                 * 網絡請求之前
                 */
                @Override
                public void onBefore() {
                    CProgressDialogUtils.showProgressDialog(MainActivity.this);
                }
    
                /**
                 * 網路請求之后
                 */
                @Override
                public void onAfter() {
                    CProgressDialogUtils.cancelProgressDialog(MainActivity.this);
                }
    
                /**
                 * 沒有新版本
                 */
    
                @Override
                public void noNewApp() {
                    Toast.makeText(MainActivity.this, "沒有新版本", Toast.LENGTH_SHORT).show();
                }
            });

                

項目地址「AppUpdateDemo

本項目進度條使用的是代碼家的「NumberProgressBar

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,076評論 25 708
  • 一個女人的成長 文/蔥蔥 一個女人的腹部 會開出一朵忘掉自己的花 把劫難當福報 用云朵的綿軟說服自己 拿玉米粒的金...
    蔥蔥_閱讀 300評論 21 17
  • 親愛的朋友圈的朋友: 你們好,當腦海中構思這篇文章的時候,并不知道是出于何種思想,或許是孤獨的太久了,想對你們說...
    深海菌閱讀 1,204評論 4 0
  • SeaJS是一個遵循CommonJS規范的JavaScript模塊加載框架。本文給大家分享sea.js知識總結,感...
    祈澈菇涼閱讀 606評論 0 0
  • 婆婆養了一只母貓,黑白相間的毛色,光溜溜的皮毛倒挺漂亮,給它叫個花麗的名字,“花麗”我嫁進門就養了幾年了。因為打小...
    流云碧草閱讀 286評論 1 7