Android开发笔记(六十一)文件下载管理DownloadManager

本文详细介绍了Android系统的DownloadManager服务,包括如何发起下载请求,监控下载操作,查询下载进度,处理下载事件,实现断点续传以及自定义进度条的显示。同时,提供了系统服务清单和关键代码示例,帮助开发者全面掌握Android文件下载管理。
摘要由CSDN通过智能技术生成

下载管理DownloadManager

文件下载其实是网络数据访问的一种特殊形式,使用普通的http请求也能完成,就是实现起来会繁琐一些。因为下载功能比较常用,而且业务功能相对统一,所以从Android 2.3(API level 9)开始,Android提供了DownloadManager用于统一管理下载功能。


下载请求

要想使用下载功能,首先得构建一个下载请求,说明从哪里下载、下载参数为何、下载的文件保存到哪里等等。这个下载请求便是DownloadManager的子类Request,下面是该类的常用方法
Request构造函数 : 指定从哪个网络地址下载文件。
Request.setAllowedNetworkTypes : 指定允许进行下载的网络类型。Request.NETWORK_WIFI表示wifi环境(推荐),Request.NETWORK_MOBILE表示数据连接环境(不推荐),Request.NETWORK_BLUETOOTH表示蓝牙环境。
Request.setDestinationInExternalFilesDir : 设置下载文件在本地的保存路径。
Request.addRequestHeader : 给HTTP请求添加头部参数。
Request.setMimeType : 设置下载文件的媒体类型。
Request.setVisibleInDownloadsUi : 设置下载页面是否可见。
Request.setNotificationVisibility : 设置通知栏上的下载任务的可见类型。Request.VISIBILITY_HIDDEN表示隐藏,Request.VISIBILITY_VISIBLE表示下载时可见(下载完成后消失),Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED表示下载进行时与完成后都可见,Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION表示只有下载完成后可见。注意可见类型设置为VISIBILITY_HIDDEN时,需要在AndroidManifest.xml中加入对应权限,即android.permission.DOWNLOAD_WITHOUT_NOTIFICATION
Request.setTitle : 设置通知栏上的消息标题。不建议自行设置标题,因为默认标题是下载的文件名。
Request.setDescription : 设置通知栏上的消息描述。不建议自行设置描述,因为默认描述是系统估算的下载剩余时间。


下载操作

构建下载请求完毕,然后才能进行下载的相关操作。下面是DownloadManager常用的下载方法:
enqueue : 将下载请求加入到任务队列中,即开始下载任务。该方法返回本次下载任务的编号。
remove : 取消指定编号的下载任务。
restartDownload : 重新下载指定编号的任务。
openDownloadedFile : 打开下载完成的文件。
getMimeTypeForDownloadedFile : 获取下载完成的文件的媒体类型。


查询下载进度

虽然下载进度可在通知栏上查看,但是有时APP自身也想了解当前的下载进度,那就要调用DownloadManager的query方法。该方法的输入参数是一个Query对象,返回结果集的Cursor游标,有关Cursor的用法参见《 Android开发笔记(三十一)SQLite游标及其数据结构》。下面是Query类的常用方法:
query : 查询指定编号任务的当前下载信息。
Query.setFilterById : 根据编号来过滤下载任务。
Query.setFilterByStatus : 根据状态来过滤下载任务。


下载事件

与文件下载有关的事件不是由监听器实现,而是由广播来实现。主要的下载事件有下面三个:
1、下载完成事件:在下载完成时,系统会发出一个action为DownloadManager.ACTION_DOWNLOAD_COMPLETE(android.intent.action.DOWNLOAD_COMPLETE)的广播,因此可注册一个该广播的接收器,用来判断当前下载任务是否已下载完毕,以及后续的处理。
2、下载进行时的通知栏点击事件:在下载过程中,用户点击通知栏上的下载任务,系统便发出action为DownloadManager.ACTION_NOTIFICATION_CLICKED(android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED)的广播,所以可注册该广播的接收器进行相关处理,比如说跳转到该任务的下载进度页面;
3、下载完成后的通知栏点击事件:在不同时刻点击下载任务,会触发不同的事件。下载未完成时点击,触发的是系统广播DownloadManager.ACTION_NOTIFICATION_CLICKED;下载完成后点击,触发的是系统的ACTION_VIEW即浏览页,该动作由系统根据媒体类型去寻找对应的程序来打开,并没有发出广播消息。如果我们要控制此时的点击行为,可以在Request中通过setMimeType方法设置媒体类型,这样Android就会按照这个类型做对应的浏览处理。


断点续传及其他

博主一开始学习DownloadManager时,就觉得好奇怪,该工具竟然没有提供暂停方法和恢复方法,这岂不意味着,文件下载没法断点续传了么?后来在实际开发中测试发现,DownloadManager其实比较智能,当网络一直是允许类型时,任务会一直下载;当网络断开或者不在允许范围内时,任务会自动暂停下载;只要网络连上或者切换到允许范围内,那么任务会自动恢复下载(这里会断点续传)。所以呢,开发者不用关心异常中断,也不用关心网络切换时的额外处理了,原来DownloadManager都已经帮我们实现了。


另外,同一个文件被重复下载时,已经下载完的文件并不会被覆盖,后来下载的文件会自动重命名。所以有时会发现下载下来的文件名与源文件名不一致,这很可能是重复下载造成了文件重命名。


自定义进度条

文件下载和上传都经常用到进度条,可是Android自带的ProgressBar无法显示进度百分比的文本。既然如此,我们还是基于ProgressBar自定义一个附带百分比文本的进度条,顺便复习一下自定义视图的用法。


首先在自定义类CustomProgressBar中声明一个画笔与百分比文本,然后提供百分比文本的设置和获取方法,最后重写onDraw方法,在控件中央使用drawText函数画上百分比文本。百分比文本的颜色可通过画笔的setColor来设置,文本大小可通过画笔的setTextSize来设置。


下面是CustomProgressBar的代码示例:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.Attrib
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android开发中,我们可以利用DownloadManager类实现下载功能。DownloadManagerAndroid系统提供的一个用于管理下载任务的类,它负责处理下载请求,管理和控制下载任务的状态。 实现下载功能的步骤如下: 1. 创建DownloadManager对象: ``` DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); ``` 2. 构建下载请求: ``` DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadUrl)); request.setTitle("文件名"); // 设置下载文件的标题 request.setDescription("下载中"); // 设置下载的描述信息 request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE); // 设置下载通知的可见性 request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "文件名"); // 设置下载文件的保存路径和文件名 ``` 3. 添加下载请求到DownloadManager队列中: ``` long downloadId = downloadManager.enqueue(request); ``` 4. 监听下载状态: ``` BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); if (id == downloadId) { DownloadManager.Query query = new DownloadManager.Query(); query.setFilterById(downloadId); Cursor cursor = downloadManager.query(query); if (cursor.moveToFirst()) { int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); if (status == DownloadManager.STATUS_SUCCESSFUL) { // 下载成功 } else if (status == DownloadManager.STATUS_FAILED) { // 下载失败 } else if (status == DownloadManager.STATUS_RUNNING) { // 下载中 } } cursor.close(); } } }; registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); ``` 通过以上步骤,我们可以利用DownloadManager实现下载功能。用户可以通过监听下载状态,获取下载任务的状态并进行相应的处理,例如在下载完成时显示通知,或者在下载失败时提示用户重新下载

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值