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更新下载安装的全部工作。相信大家也有了更深的认识和理解。

本篇博客的内容就到此为止了,有问题的朋友可以留言给我。

源码下载

时间: 2024-10-12 23:01:29

Android实现App版本自动更新的相关文章

app版本自动更新-iOS忙里偷闲整理系列

原理啊,其实很简单,就是比较app的当前版本号和服务器上的版本号是否一样,不一样就提示更新. iOS程序自动提示更新的实现方案大致分为两种:第一种,自己服务器提供一个接口,告知相关app的当前版本,是否需要更新,以及更新的地址等信息 .第二种,就是利用苹果的appStore 提供的相关api进行查询更新. 代码如下: #define APPUrl @"http://itunes.apple.com/lookup?id=你应用ID 在itunes上的" // 检查是否更新 -(void)

Android 最新L版本,更新内容

Android L版本重大修改 一:New Android Runtime (ART) 新的运行环境,4.4一下的版本ART是可选的运行环境,默认还是Dalvik.但是在Android L版本之后默认环境就是ART了. 新的特性如下: 1.Ahead-of-Time (AOT).提前预编译,在运行时之前将代码编译成可执行的文件,并保存起来. 2.改进了垃圾回收功能. 3.改进了bug调试功能. 大多数应用不需要更改便可以运行在ART环境下,但是一下的情况你需要注意一下: 1.使用了Java Na

iOS 版本自动更新

AppDelegate.h - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    [self  editionUpdate]; } //版本自动更新 -(void)editionUpdate{    NSString * [email protected]"192.168.......";//获取后台的接口    

iOS中如何知道app版本已更新

主要用于程序升级,开启程序后是否显示新特性两个方面. 1.苹果app版本 苹果规定,程序的版本只能升不能降.例如1.0->1.1可以,1.1->1.0就不可以,不允许上架. 2.app版本存放位置 版本信息存放在Info.plist文件中,在工程的General栏中也可以看到.当app更新后,这里的版本信息会自动修改,因此获取Info.plist中的版本信息即为最新的版本.如果想人为的修改它们在两处的任意一处均可.  3.代码实现(Swift) 程序中将上次的版本保存入沙盒,然后和最新的做比较

winform版本自动更新

我们在使用软件的时候经常会遇到升级版本,这也是Winform程序的一个功能,今天就大概说下我是怎么实现的吧(代码有点不完美有小BUG,后面再说) 先说下我的思路:首先在打开程序的时候去拿到我之前在网站上写好的xml里边的版本号,判断是否要更新,之后要更新的话就调用更新的exe(ps:这个是单独出来的,因为更新肯定要覆盖当前的文件,文件运行的时候不能被覆盖),然后下载最新的压缩包到本地,调用7z解压覆盖即可 思路明确了之后就开始写代码(所以说思路很重要啊!!!): <?xml version=&quo

iOS开发之一句代码检测APP版本的更新-Swift版本

//新建一个NSObject类,将以下代码拷贝到此类中. // // HKCheckVersionManager.swift // ProjectManager // // Created by isHakan on 2017/12/29. // Copyright ? 2017年 liuhuakun. All rights reserved. // import UIKit class HKCheckVersionManager: NSObject { /// app版本更新检测 /// //

微信小程序版本自动更新弹窗提示

代码如下: onLaunch () { if (wx.canIUse('getUpdateManager')) { const updateManager = wx.getUpdateManager() updateManager.onCheckForUpdate(function (res) { if (res.hasUpdate) { updateManager.onUpdateReady(function () { wx.showModal({ title: '更新提示', content

手机安全卫士------自动更新的设置

由于手机安全卫士每次打开都要进行检查软件版本的工作,久而久之会浪费用户的流量.因此,我们要在设置页面中,由用户自己确认是否需要开启检查更新的操作. 效果图: 技术点: 1.自定义组合控件 2.SharedPreferences的读写操作 自定义组合控件 和之前自定义风格的原因一样,都是为了减少工作量.由于该组合控件会有很多地方要用到,因此,我们把它抽取出来,封装在一个类中,需要使用的时候直接调用即可.一劳永逸! 思路: 创建一个布局文件,包括两个TextView,一个CheckBox如效果图的形

QML 从无到有 3 (自动更新)

新的需求出来啦,需要自动更新功能,不怕程序升级了. 自动更新,QML不好写,需要c++来辅助,这里就涉及QML中调用c++功能(这里就不写了,百度一下,很多). 思路:获取版本>下载程序>安装程序 第一步,获取版本信息,可以通过XMLHttpRequest获取最新版本. 第二步,下载程序,通过Qt c++的QtNetwork: 头文件: 1 #ifndef ZRDOWNLOAD_H 2 #define ZRDOWNLOAD_H 3 4 #include <QObject> 5 #i