update 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
update 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
update 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 Apache-2.0 License
开发语言 Java
操作系统 跨平台
软件类型 开源软件
所属分类 手机/移动开发
开源组织
地区 不详
投 递 者 首席测试
适用人群 未知
收录时间 2021-11-26

软件简介

update

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

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

update1 update2 update3 update4

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.
展开阅读全文

代码

评论 (0)

加载中
更多评论
暂无内容
发表了博客
2019/10/09 08:45

ORACLE FOR UPDATE与FOR UPDATE OF区别

本文转自:http://blog.sina.com.cn/s/blog_61cd89f60102e7di.html 在生产数据库中,我们为了保证数据读、写的唯一性,经常会碰到下面五种锁语句,区别在那?下面我们用实例说明一下: 1、FOR UPDATE 2、FOR UPDATE OF COLUMN 3、FOR UPDATE WAIT 4、FOR UPDATE NOTWAIT 5、FOR UPDATE NO WAIT SKIP LOCK 下面先来看看几个例子: 1、SELECT * FROM EMP FOR UPDATE ;  --锁定表的所有行,只能读不能写 1 declare 2 curso...

0
0
发表于数据库专区
2016/06/27 17:51

For Update

心得: 项目中使用 for update 来控制业务逻辑,实际上 for update 是不推荐开发中使用的一种锁,原因是非常容易产生死锁。 还要注意的是锁的级别,因为InnoDB 的锁是建立在索引上,如果你没有使用索引查询数据,那么锁的级别就是表,否则就是索引数据也就是行级锁 个人觉得,尽量使用数据校验+数据回滚的方式来避免业务上的控制,比如库存数量,我们可以通过最后库存数的大小判断是否需要回滚。 日志: Caused by: com.mysql.j...

0
1
发表了博客
2019/05/14 09:14

update

<div class="htmledit_views" id="content_views"> <h3><a name="t0"></a><span style="font-family:'FangSong_GB2312';font-size:18px;">一、前言</span></h3><p>当在 update 语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置 SET 关键字,并剔除追加到条件末尾的任何不相关的逗号。使用 if+set 标签修改后,如果某项为 null 则不进行更新,而是保持数据库原值。<br></p><h3><a ...

0
0
发表了博客
2018/03/26 00:01

update

Date todo 20180317 Opencv a) Install opencv+python+ide (http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_setup/py_setup_in_windows/py_setup_in_windows.html)。--> G:\Python35-32 à http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_image_display/py_image_display.html#display-image à http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutori...

0
0
发表于数据库专区
2018/06/10 13:10

for update

悲观锁是对数据被的修改持悲观态度(认为数据在被修改的时候一定会存在并发问题),因此在整个数据处理过程中将数据锁定。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在应用层中实现了加锁机制,也无法保证外部系统不会修改数据) -- 第一个客户端 START TRANSACTION; SELECT * FROM montauban_wish WHERE id = 7 FOR UPDATE; UPDATE montauban_w...

0
0
发表了博客
2013/07/16 10:58

select for update nowait 与 select for update

nowait的含义很多人都会误解为“不用等待,立即执行”。但实际上该关键字的含义是“不用等待,立即返回” 如果当前请求的资源被其他会话锁定时,会发生阻塞,nowait可以避免这一阻塞,因为 If another user is in the process of modifying that row, we will get an ORA‐00054 Resource Busy error. We are blocked and must wait for the other user to finish with it. 可以实验下,我用pl/sql developer锁定表game S...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
0 评论
0 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部