Android APP更新下载工具类——简单封装DownloadManager

2024-06-21 10:18

本文主要是介绍Android APP更新下载工具类——简单封装DownloadManager,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

几乎所有APP都包含了检查更新功能,更新下载功能的实现方式常用的有两种:1、使用App网络框架的文件下载请求;2、使用自带的DownloadManager类;本文介绍第二种,简单封装一下DownloadManager进行下载更新。


重要声明:
本文严格意义上来说并非原创,参考了网上一些文章,他们写的都很好,博主只是按照自己的习惯再次封装一遍,方便自己使用,在此发出只供大家分享指教


参考文章:CSDN——http://blog.csdn.net/sir_zeng/article/details/8983430

                   简书——http://www.jianshu.com/p/7ad92b3d9069

正文:

在此不对DownloadManager做解释,请参考上边两篇文章

1、初始化

DownloadManager downloadManager;
/*** 初始化downloadManager*/
private void getService() {String serviceString = Context.DOWNLOAD_SERVICE;downloadManager = (DownloadManager) context.getSystemService(serviceString);
}

2、发起下载任务,主要是对DownloadManager.Request request 对象进行配置

List<Long> downloadIds;//记录所有下载任务id/** * @param uil 下载地址 * @param title 通知栏标题* @param description 描述* @return */ 
public long download(String uil, String title, String description) {Uri uri = Uri.parse(uil);DownloadManager.Request request = new DownloadManager.Request(uri);//设置下载地址request.setTitle(title);//设置Notification的title信息request.setDescription(description);//设置Notification的message信息request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);//设置通知栏下载通知显示状态//下载到download文件夹下 request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "update.apk");//只能在WiFi下进行下载request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);//reference变量是系统为当前的下载请求分配的一个唯一的ID,我们可以通过这个ID重新获得这个下载任务,进行一些自己想要进行的操作或者查询long id = downloadManager.enqueue(request);downloadIds.add(id);return id; 
}

3、辅助方法 判断下载组件是否可以 和 开启下载组件


/*** 判断下载组件是否可用** @param context* @return*/private boolean canDownloadState(Context context) {try {int state = context.getPackageManager().getApplicationEnabledSetting("com.android.providers.downloads");if (state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED|| state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER|| state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) {return false;}} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 启用下载组件** @param context*/private void enableDowaload(Context context) {String packageName = "com.android.providers.downloads";Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);intent.setData(Uri.parse("package:" + packageName));context.startActivity(intent);}

4、下载完成监听

(1)定义下载完成监听接口

/*** 下载完成监听*/public interface OnDownloadCompleted {public void onDownloadCompleted(long completeDownloadId);}

(2)继承BroadcastReceiver监听下载完成消息

OnDownloadCompleted onDownloadCompleted;
/*** 下载完成监听*/
class DownloadCompleteReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {long completeDownloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);//获取下载完成任务的idif (onDownloadCompleted != null) {onDownloadCompleted.onDownloadCompleted(completeDownloadId);//调用下载完成接口方法}//下载完成后删除idfor (int i = 0; i < downloadIds.size(); i++) {if (completeDownloadId == downloadIds.get(i)) {downloadIds.remove(i);}}}
}


(3)在Activity或Service中注册DownloadBroadcast广播和监听接口

DownloadCompleteReceiver downLoadCompleteReceiver;/*** 注册广播并注册监听接口** @param onDownloadCompleted*/
public void registerReceiver(OnDownloadCompleted onDownloadCompleted) {context.registerReceiver(downLoadCompleteReceiver,new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));this.onDownloadCompleted = onDownloadCompleted;
}

(4)使用结束后记得解除DownloadCompleteReceiver广播的注册

/*** 解除注册广播*/public void unregisterReceiver() {context.unregisterReceiver(downLoadCompleteReceiver);}

5、获取下载完成的apk文件并安装

/*** 根据任务id打开安装界面** @param downloadApkId*/public void installApk(long downloadApkId) {Intent install = new Intent(Intent.ACTION_VIEW);Uri downloadFileUri = downloadManager.getUriForDownloadedFile(downloadApkId);//获取下载文件路径if (downloadFileUri != null) {install.setDataAndType(downloadFileUri, "application/vnd.android.package-archive");install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);try {context.startActivity(install);//打开安装界面} catch (ActivityNotFoundException ex) {ex.printStackTrace();}}}

6、获取所有任务id

/*** 获取当前下载的所有任务 id** @return*/public List<Long> getDownloadIds() {return downloadIds;}

8、构造方法

public DownloadManagerUtils(Context context) {this.context = context;getService();downLoadCompleteReceiver = new DownloadCompleteReceiver();downloadIds = new ArrayList<Long>();}

9、使用

DownloadManagerUtils downloadManagerUtils;private void testDownload(){downloadManagerUtils  = new DownloadManagerUtils(this);long id = downloadManagerUtils.download("http://www.apk3.com/uploads/soft/guiguangbao/txsjgj.apk","测试下载","这是一次测试下载");downloadManagerUtils.registerReceiver(new DownloadManagerUtils.OnDownloadCompleted() {//注册广播和下载完成监听@Overridepublic void onDownloadCompleted(long completeDownloadId) {downloadManagerUtils.installApk(completeDownloadId);//调用第5步的方法}});}@Overrideprotected void onDestroy() {downloadManagerUtils.unregisterReceiver();//销毁是解除注册super.onDestroy();}

10、总结:
本文对于DownloadManager的应用智能使用与app更新下载,当然DownloadManager是可以下载各种文件的,具体请参考文章开始两篇文章。


结尾:本文只是个人观点,文章中如有不妥之处敬请留言指教。

这篇关于Android APP更新下载工具类——简单封装DownloadManager的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1080943

相关文章

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Ubuntu 24.04 LTS怎么关闭 Ubuntu Pro 更新提示弹窗?

《Ubuntu24.04LTS怎么关闭UbuntuPro更新提示弹窗?》Ubuntu每次开机都会弹窗提示安全更新,设置里最多只能取消自动下载,自动更新,但无法做到直接让自动更新的弹窗不出现,... 如果你正在使用 Ubuntu 24.04 LTS,可能会注意到——在使用「软件更新器」或运行 APT 命令时,

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in