Android实现App版本自动更新
现在很多的App中都会有一个检查版本的功能。例如斗鱼TV App的设置界面下:
当我们点击检查更新的时候,就会向服务器发起版本检测的请求。一般的处理方式是:服务器返回的App版本与当前手机安装的版本号进行对比。
(1)如果服务器所返回的版本号大于当前App版本号那么此时手机所安装的App不是最新版。可以提示用户升级。
(2)如果不大于当前版本号,可以提示用户为最新版本:
版本升级,也分为两种处理方式:
(1)跳转到App某市场(例如:360手机助手),然后根据包名在市场定位到该App,通过市场下载更新安装。
(2)在本App中实现Apk下载,下载完成后更新安装。
本篇博客的内容将围绕如何实现Apk下载,下载完成后更新安装来展开。
下面我将内容大致分为以下几个部分:
(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更新下载安装的全部工作。相信大家也有了更深的认识和理解。
本篇博客的内容就到此为止了,有问题的朋友可以留言给我。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
android 图片二维码识别和保存(二)
续上一篇,开发图片二维码识别功能后,我们对功能进行性能分析内存占用显著提高了,不使用该功能内存占用大约是147M,使用这个功能多次以后,高达203M。 因此对功能进行研究,发现每次生成的图片没有即时的释放,导致内存中的图片不断累积,内存占用不断攀升。因此,需要对图片进行释放,释放的时候需要特别关注的地方有: 1.释放注意图片的状态。 2.注意异常的捕获。 下面就是图片释放的有关代码。 /** * 回收bitmap */ public static void recycleBitmap(Bitmap bitmap ) { if(bitmap != null && !bitmap.isRecycled()){ bitmap.recycle(); bitmap = null; } } 对于异常的捕获主要是需要关注图片在进行encode和decode过程中的处理,原来的方法应该改为如下: public static Result handleQRCodeFormBitmap(Bitmap bitmap) { Map<DecodeHintType, Object> h...
-
下一篇
【iOS】用strong和weak来修饰成员变量的对比
对于纯代码布局,用@property声明成员变量时,我是很自然的用strong来修饰的。然后突然有人问我用weak来修饰可不可以,我第一反应是不可以,因为用weak来修饰,初始化过后就会被释放掉,就算我第一句写了初始化的方法,立即执行addSubView也是没办法将其添加上去的。xcode也给出了很明确的警告:Assigning retained object to weak variable; object will be released after assignment。然后他又给分析了一堆内存管理的东西,得出的结论是可以。 由于我之前确实没有思考过这个问题,对于这个结论我也是半信半疑,然后我就写了个demo来验证。自己写demo之前我想起了之前看过的一些代码,有些成员变量是用weak修饰的,初始化方法是将一个临时变量赋值给它,然后将它加到父View上,我很不理解这样为什么这样写,直接用strong修饰,然后来个懒加载初始化不是更好?或者直接初始化然后再添加?这样算起来还少一行代码。。。 写demo的过程中我又发现了一些其他的东西,首先我声明两个成员变量,一个strong修饰,一...
相关文章
文章评论
共有0条评论来说两句吧...