当前位置: 首页 > 软件库 > 手机/移动开发 > >

update

清晰灵活简单易用的应用更新库
授权协议 Apache-2.0 License
开发语言 Java
所属分类 手机/移动开发
软件类型 开源软件
地区 不详
投 递 者 盖辉
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

update

清晰灵活简单易用的应用更新库

  • 支持断点续传
  • 支持静默下载:有新版本时不提示直接下载
  • 支持强制安装:不安装无法使用app
  • 支持下载完成后自动安装
  • 支持可忽略版本
  • 支持app启动时强制安装下载好了的更新包
  • 支持POST请求
  • 支持自定义解析服务器返回的数据
  • 支持自定义查询/下载
  • 支持自定义提示对话框/下载进度对话框
  • 支持通知栏进度显示
  • 适配 Android 7.0 FileProvider

Gradle

repositories { 
    maven { url "https://jitpack.io" }
} 

dependencies {
    compile 'com.github.czy1121:update:1.1.1'
}

Usage

基本用法

默认情况下,查询请求会需要三个参数: 包名(package), 版本号(version), 渠道(channel)package/version 从应用的 context 获取

// 设置默认更新接口地址与渠道 
UpdateManager.setUrl(mCheckUrl, "yyb");
// 进入应用时查询更新
UpdateManager.check(context);
// 在设置界面点击检查更新
UpdateManager.checkManual(context);
// 如果有已经下载好了的更新包就强制安装,可以在app启动时调用
UpdateManager.install(context);

假设,包名是ezy.demo.update,版本号为123传入地址 http://example.com/check,传入渠道 yyb那请求的url是 http://example.com/check?package=ezy.demo.update&version=123&channel=yyb

设置请求url

设置url后不会额外添加 package/version/channel 等参数

UpdateManager.create(this).setUrl(mCheckUrl).check();

发送POST请求

UpdateManager.create(this).setUrl(mCheckUrl).setPostData("param=abc&param2=xyz").check();

解析查询结果

查询结果需要解析成 UpdateInfo

public class UpdateInfo {
    // 是否有新版本
    public boolean hasUpdate = false;
    // 是否静默下载:有新版本时不提示直接下载
    public boolean isSilent = false;
    // 是否强制安装:不安装无法使用app
    public boolean isForce = false;
    // 是否下载完成后自动安装
    public boolean isAutoInstall = true;
    // 是否可忽略该版本
    public boolean isIgnorable = true;
    
    public int versionCode;
    public String versionName;
    public String updateContent;
    
    public String url;
    public String md5;
    public long size;
}

关于md5

  1. 有新版本时,url与md5字段为必填
  2. md5始终是是url所表示的apk文件内容的md5,不是keystore的md5
  3. md5用于确保安装的是完整正确apk,防止下载过程中apk内容被修改篡改替换
  4. 不知道如何获取文件md5可参考Update.md5或google/baidu

可以定制解析过程

UpdateManager.create(this).setUrl(mCheckUrl).setParser(new IUpdateParser() {
    @Override
    public UpdateInfo parse(String source) throws Exception {
        UpdateInfo info = new UpdateInfo(); 
        // todo
        return info;
    }
}).check();

定制查询

UpdateManager.create(this).setUrl(mCheckUrl).setChecker(new IUpdateChecker() {
    @Override
    public void check(ICheckAgent agent, String url) {
        HttpURLConnection connection = null;
        try {
            connection = (HttpURLConnection) new URL(url).openConnection();
            connection.setRequestProperty("Accept", "application/json");
            connection.connect();
            if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                agent.setInfo(UpdateUtil.readString(connection.getInputStream()));
            } else {
                agent.setError(new UpdateError(UpdateError.CHECK_HTTP_STATUS, "" + connection.getResponseCode()));
            }
        } catch (IOException e) {
            e.printStackTrace();
            agent.setError(new UpdateError(UpdateError.CHECK_NETWORK_IO));
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }
    }
}).check();

定制下载

UpdateManager.create(this).setUrl(mCheckUrl).setDownloader(new IUpdateDownloader() {
    @Override
    public void download(IDownloadAgent agent, String url, File temp) {
        new UpdateDownloader(agent, context, url, temp).execute();
    }
}).check();

更新版本对话框

UpdateManager.create(this).setPrompter(new IUpdatePrompter() {
    @Override
    public void prompt(IUpdateAgent agent) {
        // todo : 根据 agent.getInfo() 显示更新版本对话框,具体可参考 UpdateAgent.DefaultUpdatePrompter
    }
}).check();

没有新版本或出错

UpdateManager.create(this).setOnFailure(new OnFailureListener() {
    @Override
    public void onFailure(UpdateError error) {  
        Toast.makeText(mContext, error.toString(), Toast.LENGTH_LONG).show();
    }
}).check();

显示下载进度

可在通知栏显示下载进度,当 info.isSilent 为 true 显示

默认通知栏进度

UpdateManager.create(this).setNotifyId(998).check();

定制通知栏进度

UpdateManager.create(this).setOnNotificationDownloadListener(new OnDownloadListener() {
    @Override
    public void onStart() {
        // todo: start
    }

    @Override
    public void onProgress(int progress) {
        // todo: progress
    }

    @Override
    public void onFinish() {
        // todo: finish
    }
}).check();

定制下载进度的对话框,当 info.isSilent 为 false 显示

UpdateManager.create(this).setOnDownloadListener(new OnDownloadListener() {
    @Override
    public void onStart() {
        // todo: start
    }

    @Override
    public void onProgress(int progress) {
        // todo: progress
    }

    @Override
    public void onFinish() {
        // todo: finish
    }
}).check();

License

Copyright 2016 czy1121

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
  • 订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我。推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量4300+,购买任意白宝书体系化专栏可加入TFS-CLUB 私域社区。 福利:加入社区的小伙伴们,除了可以获取博主所有付费专栏的阅读权限之外,还有机会加入 星荐官共赢计划 ࿰

  • 1.MySQL UPDATE JOIN语法 在MySQL中,可以在 UPDATE语句 中使用JOIN子句执行跨表更新。MySQL UPDATE JOIN的语法如下: UPDATE T1, T2, [INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1 SET T1.C2 = T2.C2, T2.C3 = expr WHERE condition 更详

  • MySQL 可以基于多表查询更新数据。对于多表的 UPDATE 操作需要慎重,建议在更新前,先使用 SELECT 语句查询验证更新的数据与自己期望的是否一致。 下面我们建两张表,一张表为 product 表,用来存放产品信息,其中有产品价格字段 price;另外一张表是 product_price 表。现要将 product_price 表中的价格字段 price 更新为 product 表中价格

  • 本文详细介绍了,mysql中update语句的用法,系统全面的学习下update更新语句的用法,有需要的朋友可以参考下 首先,单表的UPDATE语句: UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition] [ORDER BY ...]

  • db.collection.updateOne(filter,update,options) 顾名思义,通过这行声明,我们大概可以猜到这三个参数大概的作用: filter 用作在更新之前筛选符合条件的document update 具体更新document中哪些字段 options 附加可选的额外操作 整体updateOne语句的语法如下: db.collection.updateOne(

  • 转载:http://www.jquerycn.cn/a_14726 mysql update语句的用法 首先,以单表的 UPDATE 语句,学习下 MySQL update 语句用法。 一,单表的 MySQL UPDATE 语句: UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 ...]

  • rosdep update命令使用 该方法是可以跳过sudo rosdep init初始化命令设置的,前提是安装ros:(https://blog.csdn.net/weixin_44023934/article/details/127510378,rosdep update是安装一些依赖库,比如在Cartographer、ORB-SLAM等算法需要使用到一些依赖库,是必须安装的,如果不是有需要的

  • 1  更新单条记录  UPDATE course SET name = 'course1' WHEREid = 'id1'; 2  更新多条记录的同一个字段为同一个值  UPDATE course SET name='course1' WHERE id in('id1','id2','id3); 3  更新多条记录为多个字段为不同的值 比较普通的写法,是通过循环,依次执行update语句。 Myb

  • 锁分类 从对数据操作的粒度分 :             1) 表锁:操作时,会锁定整个表。             2) 行锁:操作时,会锁定当前操作行。 从对数据操作的类型分:             1) 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。              2) 写锁(排它锁):当前操作没有完成之前,它会阻断其他写锁和读锁。 MYSQL中各种引擎

 相关资料
  • 组件1包括:1.txt,2.txt 组件2包括:3.txt 4.txt 当组件1和组件2都选中时安装所有文件,当组件2选中而组件1未选中时安装文件3.txt,不安装组件2所属的文件4.txt。当组件1选中而组件2未选中时仅安装组件1所属的文件。 用逻辑库实现: LOGICLIB_SECTIONCMP !include LogicLib.nsh Section "区段1" Sec1 File 1.

  • 主要内容:1) 去掉循环冗余括号,2) 去掉表达式冗余括号,3) 强制的代码风格,4) 不再纠结于 i++ 和 ++iGo语言语法类似于C语言,因此熟悉C语言及其派生语言( C++、 C#、Objective-C 等)的人都会迅速熟悉这门语言。 C语言的有些语法会让代码可读性降低甚至发生歧义。Go语言在C语言的基础上取其精华,弃其糟粕,将C语言中较为容易发生错误的写法进行调整,做出相应的编译提示。 1) 去掉循环冗余括号 Go语言在众多大师的丰富实战经验的基础上诞生,去除了C语言语法中一些冗余、

  • 本文向大家介绍python中yield的用法详解——最简单,最清晰的解释,包括了python中yield的用法详解——最简单,最清晰的解释的使用技巧和注意事项,需要的朋友参考一下 首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考

  • 一种更清晰的Android架构 原文链接 : Architecting Android…The clean way? 译文出自 : 开发技术前线 www.devtf.cn 译者 : Mr.Simple & Sophie.Ping 过去几个月以来,通过在Tuenti网站上与@pedro_g_s和@flipper83(安卓开发两位大牛)进行友好讨论之后,我决定写这篇关于架构安卓应用的文章。 我写这篇文

  • 虽然vue3能够把相关的代码写在一起,但是感觉所有代码都在同一层级,除了增加换行、增加region折叠外,寻找起代码来还是很痛苦,尤其是并不是总能清晰地按相关度分隔。请教各位大佬,你们是如何做的?

  • update 修改表数据update($table, $data, $where) table [string] 表名. data [array] 修改的数据. where (optional) [array] WHERE 条件.[可选]Return: [number] 受影响的行数.你可以修改没有序列化的数组, 并且能使用 [+], [-], [*], [/] 来做运算 $database->u

  • update 修改表数据update($table, $data, $where) table [string] 表名. data [array] 修改的数据. where (optional) [array] WHERE 条件.[可选]Return: [number] 受影响的行数.你可以修改没有序列化的数组, 并且能使用 [+], [-], [*], [/] 来做运算 class Foo {

  • 我的问题是,如果我知道中设置的值,那么也是由我设置的,那么assertEquals将始终传递给测试,对吗?它本质上是在测试1==1种测试。那么做这些单元测试有什么意义呢?我知道服务对象不应该连接到实际的DB,因此我们在嘲笑它。那么做这些测试有什么意义呢?关于如何查看单元测试,我是否错过了更大的图景? 附言。-请随时删除此问题,如果它违反了本论坛的规则。