如今不少的App中都会有一个检查版本的功能。例如斗鱼TV App的设置界面下:android
当咱们点击检查更新的时候,就会向服务器发起版本检测的请求。通常的处理方式是:服务器返回的App版本与当前手机安装的版本号进行对比。服务器
(1)若是服务器所返回的版本号大于当前App版本号那么此时手机所安装的App不是最新版。能够提示用户升级。异步
(2)若是不大于当前版本号,能够提示用户为最新版本:工具
版本升级,也分为两种处理方式:.net
(1)跳转到App某市场(例如:360手机助手),而后根据包名在市场定位到该App,经过市场下载更新安装。教程
(2)在本App中实现Apk下载,下载完成后更新安装。生命周期
本篇博客的内容将围绕如何实现Apk下载,下载完成后更新安装来展开。rem
下面我将内容大体分为如下几个部分:get
(1)App版本检测博客
(2)Apk下载
(3)Apk更新安装
(4)对以上功能进行封装
基于以上4部分,咱们逐一展开。
1.App版本检测:
要实现App的更新下载,咱们上面介绍了,前提是服务器要保存一个App的版本号(一般的方式是保存versionCode,固然你要对比versionName也不要紧)。当用户去手动检测版本,或者进入首页自动检测时,第一步是须要请求服务器的版本号,拿到版本号以后与当前App版本号(当前版本号可经过PackageInfo获取)进行对比。服务器返回的版本号大于当前App版本号,证实App已经有更新,那么进入第2步。
2.Apk下载
Apk文件是保存在服务器的。咱们能够经过Http流将其下载到本地手机,而后更新安装。Android中下载的方式不少种:HttpUrlConnection,Retrofit,okHttp,以及android原生的下载工具类DownLoadManager 等等。咱们采用的方式是Google推荐的下载工具类DownLoadManager。关于DownLoadManager的使用其实很简单,简单归纳以下:
(1)经过getSystemService获取DownLoadManager。
(2)初始化DownLoadManager的Request,构建下载请求。
(3)调用DownLoadManager的enqueue异步发起请求,该方法返回值为标识当前下载任务的id,即downloadId。
(4)当下载完成后,系统会发出条件为android.intent.action.DOWNLOAD_COMPLETE的广播,咱们能够自定义广播接受器,而后在onReceive中处理下载完成的逻辑便可。
详细使用方式你们能够参考网上的教程,此处就再也不赘述。
上面经过下载啰嗦了一堆。此时咱们要想一个问题:当咱们下载完成后,并无安装。当用户再次进入App时该如何操做?
有朋友会说,那就再去下载一次,而后继续执行更新安装呀!哈哈,这种方式是没有错误的,可是若是用户恶意行为,每次下载完成都不安装,那咱们岂不是每次都要去下载100次,1000次。。(而后手机boom!!!)这种方式确定是不能采用的。那么咱们该如何解决呢?
很简单,当咱们在下载以前,先去指定的文件夹下查看有木有已经下载好的Apk,而且该Apk的版本是高于本App的版本,此时咱们就去执行安装操做。若是上面条件不成立,此时再去执行下载操做。
3.Apk更新安装
相信你们对于如何安装一个Apk都比较熟悉吧,原理也是比较简单的。
(1)经过downloadId获取下载的Uri。
(2)将Uri设置到Itent的setDataAndType做为启动条件。
(3)调用startActivity启动对应Intent便可。
以上3步,便可完成App的更新功能。
总体的流程很清晰:
版本检测 → Apk下载 (检查是否存在未安装的Apk) → Apk安装 → 完成更新
下面,经过代码来具体分析整个流程:
关于App版本检测其实就是一个Http请求,再也不多说。咱们从Apk下载开始:
上面咱们提到,在下载以前须要去检测是否存在已经下载的Apk。经过什么获取呢?没错,确定是downloadId了。
1> 若是存在downloadId,那么咱们经过downloadId获取当前下载的状态status。status分为成功,失败两种状态。
(1)当status为成功状态时,即已经下载完成,咱们就经过downloadId获取下载文件的Uri。而后能够经过Uri获取PackageInfo,与当前App进行包名和版本号的对比,当包名相同,而且当前版本号是小于下载的Apk版本号两个条件同时成立时,直接执行安装操做。不然,执行remove,经过downloadId删除下载任务以及文件,继续执行下载。
(2)当status为失败状态时,即下载未完成,咱们就直接执行从新下载便可。
2> 若是不存在downloadId,即没有下载过Apk,执行下载便可。
核心代码以下:
下载完成后,系统会发出广播,在广播中,咱们对比downloadId是否相同,相同状况下,直接经过downloadId获取Uri,而后跳转到安装界面,提示用户安装便可:
因此,别忘了在下载以前要先将该大喇叭(广播接受器)注册。
最后,当咱们安装完成后,再次进入App,就将其已下载的Apk文件进行删除(将该方法放在onCreate生命周期中便可):
上面经过downloadApk获取下载文件的地址。downloadApk地址是在下载完成后广播接收器中保存的。
经过上面的步骤,咱们就完成了App更新下载安装的所有工做。相信你们也有了更深的认识和理解。
本篇博客的内容就到此为止了,有问题的朋友能够留言给我