App启动检查更新下载安装apk

现在很多的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中处理下载完成的逻辑即可。

详细使用方式如下:

DownloadManager主要用来进行长时间http下载,是个系统后台服务。连接出错了能自己重连,重启了也能继续连。

1.得到DownloadManager

DownloadManager dm = (DownloadManager)getSystemService( DOWNLOAD_SERVICE).

2.得到连接请求对象

DownloadManager.Request   down=new DownloadManager.Request (Uri.parse("http://10.0.11.210:8080/test/我的歌声里.mp3"));

3.对请求设置参数(常用的)与开始下载

//设置允许使用的网络类型,移动网络与wifi都可以
down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE|DownloadManager.Request.NETWORK_WIFI);

//显示在下载界面,即下载后的文件在下载管理里显示
down.setVisibleInDownloadsUi(true);

//设置下载后文件存放的位置,不设置会存在data/data/com.android.provider.downloads/cache/下面,设置后存在sd上的Android/data/<包名>/files/下面。第2个参数是files下再建目录的目录名,第3个参数是文件名,如果第3个参数带路径,要确保路径存在,第2个参数路径随便写,会自己创建 down.setDestinationInExternalFilesDir(mContext, Environment.DIRECTORY_MUSIC, "我的歌声里.mp3"); 

//在通知栏显示下载详情,比如百分比。       
 down.setShowRunningNotification(true)(API 9); //默认是true,改为false需要权限android.permission.DOWNLOAD_WITHOUT_NOTIFICATION。

此方法被setNotificationVisibility(int visibility)(API  11)取代。

//以sd卡路径为根路径,与上方法只有一个有效。第一个参数创建文件夹用的是mkdir
                down.setDestinationInExternalPublicDir(Environment.DIRECTORY_MUSIC, "我的歌声里.mp3");

//将下载请求放入队列
                manager.enqueue(down);

// 下载完成后保留 下载的notification。文档上写明参数需要API 12以上。4.0的手机开始。

[java]  view plain  copy
  1. down.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);  

4.接收下载完成信息

广播接收下载完成信息,Action为DownloadManager.ACTION_DOWNLOAD_COMPLETE。

能得到下载完成的文件存在数据库中的ID:long downId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);

getUriForDownloadedFile(long id)能得到文件存储的URI。

也可以通过new一个DownloadManager.Query再setFilterById(long... ids),接着用DownloadManager的query(DownloadManager.Query query)来得到Cursor对象

5.remove(long... ids)

取消正在下载的任务或者删除下载了一部分或者全部的文件,删除对应的数据记录。

6.id怎么获取

可以监听数据库文件/data/data/com.android.provider.downloads/database/downloads.db。数据库有专门的监听类。也可以用文件监听类FileObsever监测文件变化。

得到变化的数据行。数据库里的数据并不是在下载完后才插入的,而是下载时通知栏上百分比每变化一次就更新一次。

下载百分比也是这么获取,数据库里有两个字段其中current_bytes是当前下载bit数,在等于total_bytes之前是更新的。


7.点击正在下载的notification将会受到Action为DownloadManager.ACTION_NOTIFICATION_CLICKED的广播。


下载示例代码:

[java]  view plain  copy
  1. private void begainDownload() {  
  2.     DownloadManager dm = (DownloadManager)getSystemService( DOWNLOAD_SERVICE);  
  3.     DownloadManager.Request   down=new DownloadManager.Request (Uri.parse("http://10.0.11.210:8080/test/我的歌声里.mp3"));  
  4.     down.setVisibleInDownloadsUi(true);  
  5.     down.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_MUSIC, "我的歌声里.mp3");  
  6.     down.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);  
  7.     dm.enqueue(down);  
  8. }  
tomcat服务器提供资源。文件存在了/sdcard/Android/data/<包名>/files/Music/我的歌声里.mp3

权限:

[html]  view plain  copy
  1. <uses-permission android:name="android.permission.INTERNET"/>  
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  


上面通过下载啰嗦了一堆。此时我们要想一个问题:当我们下载完成后,并没有安装。当用户再次进入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更新下载安装的全部工作。相信大家也有了更深的认识和理解。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 为了在iOS设备上实现虚拟视频插件功能,需要下载安装相应的软件。首先,在App Store中搜索“虚拟视频”或“VR视频”等关键词,就可以找到各种相关的应用程序。选择一个合适的应用程序后,可以点击“下载”按钮进行安装安装完成后,打开应用,根据具体的软件界面操作即可开始使用虚拟视频功能。 虚拟视频插件可以将普通的视频文件转换成虚拟​现实的视频,使用户在观看视频时有一种身临其境的感觉。使用虚拟视频插件需要设备支持虚拟现实技术,如VR眼镜或头戴式设备。 需要注意的是,在下载安装虚拟视频插件时,要关注软件的来源和安全性。建议选择官方应用商店或知名软件下载站点进行下载,避免下载来路不明的程序,以免给设备带来风险。此外,虚拟视频插件也需要一定的存储空间和设备性能支持,因此在安装之前要对设备进行充分的检测和准备,以便达到更好的观看效果。 ### 回答2: iOS虚拟视频插件是一种能够在iPhone或iPad设备上模拟播放虚拟视频的工具。用户可以通过插件来欣赏虚拟现实(VR)视频、全景视频或360度视频,提供更加沉浸式的观影体验。下面是关于iOS虚拟视频插件的下载安装方法: 1. 打开App Store应用商店:在iOS设备的主屏幕上找到并点击“App Store”图标。 2. 搜索插件名称:在App Store的搜索框中输入虚拟视频插件的名称,比如“VR Player”或“360 Video Player”。点击搜索按钮。 3. 查找插件:在搜索结果中找到相关的虚拟视频插件,并点击进入插件详情页面。 4. 下载插件:在插件详情页面,点击“获取”或“下载”按钮,等待插件下载完成。可能需要输入Apple ID和密码进行确认。 5. 安装插件:下载完成后,插件会自动安装到iOS设备上。在主屏幕上找到并点击插件图标,打开插件应用。 6. 浏览和观看虚拟视频:通过插件应用的界面,您可以选择和播放本地存储的虚拟视频文件,或者通过插件提供的网络资源来观看虚拟视频。根据插件的不同,可能还提供了一些额外的设置和功能供用户自定义。 请注意,不同的虚拟视频插件可能有不同的名称和特点,但是一般的下载安装步骤差不多。同时,iOS设备可能需要运行较新的操作系统版本才能支持某些虚拟视频插件,所以请确保您的设备已经更新到最新的操作系统版本。 希望以上步骤能够帮助您顺利下载安装iOS虚拟视频插件,提供更加丰富多样的观影体验。 ### 回答3: 要在iOS设备上下载安装虚拟视频插件,您可以按照以下步骤进行操作: 1. 打开App Store:在您的iOS设备上,找到并打开App Store应用。 2. 搜索插件名称:在App Store的搜索栏中,输入您想要下载安装的虚拟视频插件的名称。 3. 浏览结果:浏览搜索结果,点击您要下载的插件的名称。 4. 查看和确认:查看插件的介绍、评分和评论,确保它符合您的需求和可靠性。 5. 下载安装:点击插件页面上的“获取”或“安装”按钮。您可能需要验证Apple ID密码或使用Face ID/Touch ID进行确认。 6. 等待下载安装:等待插件完成下载安装过程。这通常只需要几秒钟或几分钟,具体时间取决于您的网络连接速度和插件的大小。 7. 完成安装:一旦插件成功下载安装,您将在主屏幕或App库中看到其图标。 8. 配置和使用:根据插件的说明,可能需要在设置中进行一些配置或在相关应用中启用功能。根据插件的功能和用途,您可以开始使用虚拟视频插件了。 请注意,为了安全起见,只从可信任的来源下载插件。另外,某些插件可能需要越狱或特定的iOS版本才能下载安装,请确保您的设备和操作系统满足插件的要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值