【需求解决系列之四】Android App在线自动更新Library(V2.0)

2023-10-29

前言

其实每个Android App都应该有一个App在线更新的功能,这样才能及时的通知用户去更新最新版本的App。这个功能其实说起来比较简单,因为流程大家都懂!但是要真正的实现,还是要考虑很多东西的!因为项目的需要,对之前已经开源的库做了下升级重构,下面就这个做个简单的介绍。

正文

特点概述

  • 最大亮点,提供12种更新的样式,总有一个是你喜欢的类型!
  • 支持三种设置更新信息的方式,您可以直接传model,传json数据,或者直接配置请求链接,sdk会自主请求并发起app的更新,满足多方需求!
  • 文件下载支持断点续传,下载错误拥有重试机制;相同版本的apk只会下载一次,防止重复下载!
  • 使用接口方式获取数据时支持设置请求头,支持POST和GET请求方式,更灵活。
  • 调用者可以自定义UI实现更新功能。
  • 已适配Android 6.0,Android 7.0,Android 8.0,Android 9.0。
  • 提供强制更新,不更新则无法使用APP,同时可以根据后台返回受影响的版本号,可控制多个版本同时被强制更新。
  • 通知栏图片自定义

Github地址:

使用方式和注意事项都在这里,点赞咱们就是好兄弟,https://github.com/MZCretin/AutoUpdateProject

Demo体验

Demo下载

扫描二维码下载Demo:

效果预览

没有效果图的demo是没有灵魂的,没图你说个锤子哦!!!

过程分析与实现阐述

下面会对本次重构中的一些细节做些说明,但是不会提及到代码,既然已经提供了demo,觉得好用的兄弟还是去看demo吧!

过程分析

整个更新的逻辑大致可分成三步:

  • 获取更新信息,校验数据,确定是否需要更新
  • 展示更新信息,处理更新逻辑
  • 下载Apk文件,安装文件

用几句话描述就是:获取服务端最新的版本信息,最新Apk文件的下载路径,最新Apk文件大小信息,是否需要强更以及需要强更的版本号;对比当前App的版本信息,确定是否需要更新,确定是否需要强制更新;选择一个好看的样式展示这些信息;当用户点击更新按钮之后,检查本地是否已经下载好Apk文件,如果已经有下载好的文件,检查这个文件的大小和版本号是否与线上的apk的文件一致,不一致直接删除重新发起下载;另外本身如果没有下载完,会继续断点续传下载;获取到最终的安装文件之后,诱导用户去安装Apk文件并做好各个Android版本的兼容问题从而实现整个App的更新操作。

拆解分步阐述
  • 获取更新信息,校验数据,确定是否需要更新

    这里需要服务器端提供数据,我们需要知道当前生产环境中最新的版本是多少,通过这个最新的版本号,跟当前app的版本做比较,如果当前的版本要低于线上环境,则需要提示更新。

    对于数据的获取也是一个比较头疼的问题,正常情况下应该都是直接请求一个接口,获取服务器端最新的版本信息,app解析对应的字段数据;但是有些时候获取这些信息并不是通过接口来实现的,也可能只是一个云端txt文件,所以获取数据的方式不能太单一。

    这里提供了两大类方式,一种是提供api接口地址,sdk自主请求加解析;另外一种是直接提供解析好的数据给sdk,sdk直接处理更新逻辑,这种方式里面有两种小的方式,一种是提供数据源model,另外一种是提供一个json字符串,交给sdk帮忙解析和处理。这样就可以满足大多数场景下的使用了。

  • 展示更新信息,处理更新逻辑

    当上一步确定需要更新之后,才会走到这一步。当确定需要更新之后,为了增强功能,我们提供了强制更新的逻辑,这种场景其实很常见,比如新版新增了一个功能,老版本无法做同步兼容处理,这个时候就需要老版本强制更新到最新的版本。

    对于强制更新,我们还做了一个优化,可以对指定的版本强更,比如当前最新版本号为10,我们希望老版本中版本号为9的强制更新,其他更老的版本普通更新,我们就可以指定需要强更新的版本号,实现指定版本强更。

    对于展示更新信息来说,可能最大的痛点在于交互和样式,对于没有UI的朋友来说,可能怎么弄都觉得不好看,所以我们这里提供了12种UI样式,总有一个是你喜欢的吧!如果这12种你还是没有喜欢的,我们也提供了自定义UI的方式给你自己折腾。

  • 下载Apk文件,安装文件

    这一步可能就是核心了,有一些注意点以及优化的思路。

    下载文件之前我们需要检查存储权限,并做好Android6.0以上申请存储权限的准备,

    下载Apk文件使用的是filedownloader,用这个的好处在于他本身支持下载失败的重试机制,断点续传的机制,以及网络切换自动重启下载等优点,对文件的下载比较友好。

    下载文件还需要注意另外一点,我们在确定需要更新之后,在下载文件之前,我们需要检测下这个版本的app是否已经下载过了,如果下载过了就不要再重复下载了!对于是否下载好了有两个判断,一个对应这个版本的apk文件是否已经存在,第二个是这个apk文件的大小是否是正确的大小,因为有可能会出现文件下载异常的可能,这个时候需要删除掉这个apk去重新下载。

    还有一点就是在下载文件之前我们还是需要友好的检测下网络环境,如果是数据流量,还是需要提醒下用户当前是非wifi环境,优化用户体验。

    另外我们提供了通知栏进度的展示功能,默认是开启的,如果你不需要,可以在配置中关掉它。有这个通知栏的好处在于,当文件下载失败并重试三次依然失败之后,通知栏会显示下载失败,点击通知栏可以唤起重新下载的逻辑,仅此而已。

    当文件下载完成之后,我们需要处理的是Apk的安装问题,要注意Android不同系统版本之前的差异,并做好相关的兼容处理,我们已经兼容到Android9.0了,具体兼容细节大家移步源代码。

结语

简书首页,链接是 https://www.jianshu.com/u/123f97613b86

掘金首页,链接是 https://juejin.im/user/5838d57fac502e006c1708bc

Github首页,链接是 https://github.com/MZCretin

CSDN首页,链接是 http://blog.csdn.net/u010998327

我是Cretin,一个可爱的小男孩。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【需求解决系列之四】Android App在线自动更新Library(V2.0) 的相关文章

随机推荐

  • 网易笔试的一道题

    写一个程序 打印出以下的序列 a b c d e z a b a c a d a e a z b c b d b z c d y z a b c a b d a b z a c d x y z a b c d x y z const cha
  • [LeetCode] Add Digits - 数字各个位数求和

    题目概述 Given a non negative integer num repeatedly add all its digits until the result has only one digit For example Give
  • Java泛型知识点总结

    一 Java泛型的概述 泛型 是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型 由来 通过Object转型问题引入 早期的Object类型可以接收任意的对象类型 但是在实际的使用中 会有类型转换的问题 也就存在这隐
  • 区块链和数据库

    本文由币乎社区 bihu com 内容支持计划奖励 这是 区块链技术指北 的第 15 篇文章 如果对我感兴趣 想和我交流 我的微信号 Wentasy 加我时简单介绍下自己 并注明来自 区块链技术指北 同时我会把你拉入微信群 区块链技术指北
  • java 版本区别,java SE是什么,下载JDK时各个名称的含义

    https blog csdn net yinghuo110 article details 80658308
  • pandas基本操作

    df转csv文件 df to csv df转excel文件 df to excel df增加列 df insert df column name data df增加行 df append df合并 df concat df索引行或者列 df
  • Qt自定义QWidget

    Qt自定义QWidget 实例1 电池 实例2 plot绘图 实例3 plot按比例绘图 实例1 电池 promotion pro QT core gui greaterThan QT MAJOR VERSION 4 QT widgets
  • 好玩的整固代码,你学会了吗?

    Win系统下 今天装机之家教你使用一行代码就可以让电脑卡的死机 可以发给朋友整蛊一下 友情提示 整蛊有的度 不要把别人惹恼了 代码 0 0 将这5个字符复制到记事本上 以bat格式保存 将这个BAT发给其他朋友让他点击试试 保证不过一会你的
  • vue3 + element plus 自定义验证规则(两个表单必填其中一个)

    element plus 表单 自定义验证规则 const validateCustom rule any value any callback any gt if contactsForm value mobile contactsFor
  • 快速上手MongoDB和Python交互

    一 安装 导入 pip install pymongo from pymongo import MongoClient MongoDB 默认没有用户名密码 二 连接数据库 方式一 client MongoClient host localh
  • InputStream转MultipartFile

    import org apache commons fileupload FileItem import org apache commons fileupload FileItemFactory import org apache com
  • 获取iOS项目名称及版本号的方法

    NSDictionary infoDictionary NSBundle mainBundle infoDictionary CFShow infoDictionary app名称 NSString app Name infoDiction
  • systemd 之 journalctl

    原文地址 https www cnblogs com itxdm p Systemd log system journalctl html Systemd 日志系统 一 前言 昨天写了一篇文章 内容为 Systemd 常规操作与彩蛋 参考了
  • JSP+Servlet实现的HR人力资源管理系统】

    基于JSP Servlet实现的HR人力资源管理系统 演示地址 http yanshi ym4j com hr01 用户名 123456 密码 123456下载地址 基于JSP Servlet实现的HR人力资源管理系统 源码世界 项目采用J
  • Python实现独热编码

    关于独热编码与哑变量编码的概念 可以参考 https blog csdn net qq 41853758 article details 81252174 离散特征的编码分为两种情况 1 离散特征的取值之间没有大小的意义 比如color r
  • 信息化工程监理规范_赛迪工程咨询出席监理企业信息化管理和智慧化服务现场经验交流会...

    7月21日 中国建设监理协会主办的 监理企业信息化管理和智慧化服务现场经验交流会 在西安召开 来自全国200余名会员代表参加会议 住房和城乡建设部建筑市场监管司副司长卫明 陕西省住房和城乡建设厅副厅长茹广生 中国建设监理协会会长王早生出席会
  • 一文看懂MySQL中order by排序语句的原理

    order by 是怎么工作的 表定义 CREATE TABLE t1 id int 11 NOT NULL city varchar 16 NOT NULL name varchar 16 NOT NULL age int 11 NOT
  • osg 嵌入Qt 窗口

    osg嵌入Qt窗口完整代码的一个示例 include
  • C++ primer 第四版 目录(仅供参考)

    目录 第1章 快速入门 1 1 编写简单的C 程序 1 2 初窥输入 输出 1 3 关于注释 1 4 控制结构 入 1 5 类的简介 1 6 C 程序 小结 术语 第一部分 基本语言 第2章 变量和基本类型 2 1 基本内置类型 2 2 字
  • 【需求解决系列之四】Android App在线自动更新Library(V2.0)

    前言 其实每个Android App都应该有一个App在线更新的功能 这样才能及时的通知用户去更新最新版本的App 这个功能其实说起来比较简单 因为流程大家都懂 但是要真正的实现 还是要考虑很多东西的 因为项目的需要 对之前已经开源的库做了