其实每一个Android App都应该有一个App在线更新的功能,这样才能及时的通知用户去更新最新版本的App。这个功能其实提及来比较简单,由于流程你们都懂!可是要真正的实现,仍是要考虑不少东西的!由于项目的须要,对以前已经开源的库作了下升级重构,下面就这个作个简单的介绍。git
使用方式和注意事项都在这里,点赞我们就是好兄弟,github.com/MZCretin/Au…github
Demo下载json
扫描二维码下载Demo:api
没有效果图的demo是没有灵魂的,没图你说个锤子哦!!!服务器
下面会对本次重构中的一些细节作些说明,可是不会说起到代码,既然已经提供了demo,以为好用的兄弟仍是去看demo吧!网络
整个更新的逻辑大体可分红三步:并发
用几句话描述就是:获取服务端最新的版本信息,最新Apk文件的下载路径,最新Apk文件大小信息,是否须要强更以及须要强更的版本号;对比当前App的版本信息,肯定是否须要更新,肯定是否须要强制更新;选择一个好看的样式展现这些信息;当用户点击更新按钮以后,检查本地是否已经下载好Apk文件,若是已经有下载好的文件,检查这个文件的大小和版本号是否与线上的apk的文件一致,不一致直接删除从新发起下载;另外自己若是没有下载完,会继续断点续传下载;获取到最终的安装文件以后,诱导用户去安装Apk文件并作好各个Android版本的兼容问题从而实现整个App的更新操做。app
获取更新信息,校验数据,肯定是否须要更新优化
这里须要服务器端提供数据,咱们须要知道当前生产环境中最新的版本是多少,经过这个最新的版本号,跟当前app的版本作比较,若是当前的版本要低于线上环境,则须要提示更新。.net
对于数据的获取也是一个比较头疼的问题,正常状况下应该都是直接请求一个接口,获取服务器端最新的版本信息,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了,具体兼容细节你们移步源代码。
简书首页,连接是 www.jianshu.com/u/123f97613…
掘金首页,连接是 juejin.im/user/5838d5…
Github首页,连接是 github.com/MZCretin
CSDN首页,连接是 blog.csdn.net/u010998327
我是Cretin,一个可爱的小男孩。