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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,122评论 25 707
  • 一个女人的成长 文/葱葱 一个女人的腹部 会开出一朵忘掉自己的花 把劫难当福报 用云朵的绵软说服自己 拿玉米粒的金...
    葱葱_阅读 291评论 21 17
  • 亲爱的朋友圈的朋友: 你们好,当脑海中构思这篇文章的时候,并不知道是出于何种思想,或许是孤独的太久了,想对你们说...
    深海菌阅读 1,183评论 4 0
  • SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架。本文给大家分享sea.js知识总结,感...
    祈澈菇凉阅读 592评论 0 0
  • 婆婆养了一只母猫,黑白相间的毛色,光溜溜的皮毛倒挺漂亮,给它叫个花丽的名字,“花丽”我嫁进门就养了几年了。因为打小...
    流云碧草阅读 273评论 1 7