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

項目地址「AppUpdateDemo

Android 版本更新

目錄

功能介紹

  • [x] 實現(xiàn)app版本更新
  • [x] 自定義接口協(xié)議,可以不改變現(xiàn)有項目的協(xié)議就能使用
  • [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

自定義接口協(xié)議

自定義接口協(xié)議,根據(jù)自己項目的接口拿穴,自己實現(xiàn) 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)
                //實現(xiàn)httpManager接口的對象
                .setHttpManager(new UpdateAppHttpUtil())
                //設置請求方式 默認get,
                .setPost(false)
                //更新地址
                .setUpdateUrl("https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/json/json.txt")
                //添加自定義參數(shù)
                .setParams(params)
                //設置頭部
                .setTopPic(R.mipmap.top_5)
                //設置主題色
                .setThemeColor(0xff034ea0)
                .build()
                //檢測是否有新版本
                .checkNewApp(new UpdateCallback() {
                    /**
                     * 解析json,自定義協(xié)議
                     *
                     * @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"))
                                    //更新內(nèi)容
                                    .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();
                    }

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

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

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


使用默認的接口協(xié)議

接口說明

1泣洞,和服務器交互請求參數(shù)

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呕诉,區(qū)分自定義消費缘厢,一個小時不限制。\r\n4甩挫,添加放棄任務接口贴硫,小時內(nèi)不生成。\r\n5伊者,消費任務手動生成英遭。",//更新內(nèi)容
  "target_size": "5M",//apk大小
  "constraint": false//是否強制更新
}

2,沒有新版本

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

1,根據(jù)自己項目使用的網(wǎng)絡框架亦渗,自己實現(xiàn)HttpManager接口挖诸,


    class UpdateAppHttpUtil implements HttpManager {
        /**
         * 異步get
         *
         * @param url      get請求地址
         * @param params   get參數(shù)
         * @param callBack 回調(diào)
         */
        @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請求參數(shù)
         * @param callBack 回調(diào)
         */
        @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 回調(diào)
         */
        @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)
            //實現(xiàn)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();
                }
    
                /**
                 * 網(wǎng)絡請求之前
                 */
                @Override
                public void onBefore() {
                    CProgressDialogUtils.showProgressDialog(MainActivity.this);
                }
    
                /**
                 * 網(wǎng)路請求之后
                 */
                @Override
                public void onAfter() {
                    CProgressDialogUtils.cancelProgressDialog(MainActivity.this);
                }
    
                /**
                 * 沒有新版本
                 */
    
                @Override
                public void noNewApp() {
                    Toast.makeText(MainActivity.this, "沒有新版本", Toast.LENGTH_SHORT).show();
                }
            });

                

項目地址「AppUpdateDemo

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

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末法精,一起剝皮案震驚了整個濱河市税灌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌亿虽,老刑警劉巖菱涤,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異洛勉,居然都是意外死亡粘秆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門收毫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攻走,“玉大人,你說我怎么就攤上這事此再∥袈В” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵输拇,是天一觀的道長摘符。 經(jīng)常有香客問我,道長策吠,這世上最難降的妖魔是什么逛裤? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮猴抹,結果婚禮上带族,老公的妹妹穿的比我還像新娘。我一直安慰自己蟀给,他們只是感情好蝙砌,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布阳堕。 她就那樣靜靜地躺著,像睡著了一般择克。 火紅的嫁衣襯著肌膚如雪嘱丢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天祠饺,我揣著相機與錄音越驻,去河邊找鬼道偷。 笑死缀旁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的勺鸦。 我是一名探鬼主播并巍,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼换途!你這毒婦竟也來了懊渡?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤军拟,失蹤者是張志新(化名)和其女友劉穎剃执,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懈息,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡肾档,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了辫继。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怒见。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖姑宽,靈堂內(nèi)的尸體忽然破棺而出遣耍,到底是詐尸還是另有隱情,我是刑警寧澤炮车,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布舵变,位于F島的核電站,受9級特大地震影響示血,放射性物質發(fā)生泄漏棋傍。R本人自食惡果不足惜救拉,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一难审、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧亿絮,春花似錦告喊、人聲如沸麸拄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拢切。三九已至,卻和暖如春秆吵,著一層夾襖步出監(jiān)牢的瞬間淮椰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工纳寂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留主穗,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓毙芜,卻偏偏與公主長得像忽媒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子腋粥,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

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