DownloadManager实现文件下载

Posted by alonealice on 2016-09-20

Android开发中,网络功能是必不可少的,其中很多时候我们还会用到文件下载。实现文件下载的方法很多,很多的第三方网络框架也都很容易的实现文件下载。这里给大家介绍系统自带的一个下载文件类DownLoadManager,它相比于其他的方法有几个优势:1.没有兼容问题。DownLoadManager在API 9时就开始支持了,所以不用担心在兼容问题。2.支持断点续传,大文件下载,自动支持通知栏进度显示。3.使用简单。

按照使用的习惯,首先来看看怎样使用

1
2
3
4
5
String url="http://7xjrms.com1.z0.glb.clouddn.com/stream.mp4";
DownloadManager.Request request=new DownloadManager.Request(Uri.parse(url));
request.setDestinationInExternalFilesDir(this,"/download",url.hashCode()+".mp4");
DownloadManager downloadManager= (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
downloadManager.enqueue(request);

使用它就这么简单。先设置下载地址,添加请求,再设置保存文件的地址,最后获取下载服务,将请求添加到下载队列。

接下来再看看怎样扩展

通过看源码,我们可以看到DownLoadManager里面有两个内部类RequestQuery。其中Request我们之前已经用到过了,它主要就是用户网络请求的,而Query则主要用于下载任务的查找等。
其它还有一些方法,我们简单来看看:

addCompletedDownload()添加一个文件到下载数据库,这样可以在系统的下载中看到这个下载任务,也可以在通知栏中显示。
getMimeTypeForDownloadedFile()根据id获取文件类型,如果下载成功,则返回下载文件的文件类型,如果不成功,则返回null。
getUriForDownloadedFile()根据id获取文件的uri,失败返回null。
openDownloadedFile()根据id打开已下载的文件。(我一直打不开。。。)
remove()删除多个下载任务和相应的下载文件
enqueue()添加下载任务
query()添加查询任务

主要的方法就这些,这些方法主要还是对整个下载服务的管理,而具体对下载任务的设置主要在Request中,接下来我们来看看Request中的方法:

setDestinationUri()
setDestinationInExternalFilesDir()
setDestinationInExternalPublicDir() 这些方法是设置文件保存的位置
allowScanningByMediaScanner()文件下载完后是否被媒体扫描(在添加请求前设置)
addRequestHeader()添加请求头
setAllowedNetworkTypes()设置下载允许的网络(可以设置为DownloadManager.Request.NETWORK_MOBILE,
DownloadManager.Request.NETWORK_WIF和DownloadManager.Request.
NETWORK_BLUETOOTH)默认情况下都可以
setAllowedOverMetered()是否允许“计量式的网络连接”执行下载操作
setAllowedOverRoaming()是否允许漫游状态下,执行下载操作
setMimeType()设置下载文件的类型
setTitle()设置通知的标题
setDescription()设置通知的描述
setNotificationVisibility()设置是否显示通知
setVisibleInDownloadsUi()设置是否显示在系统下载列表中

这些方法,基本上完全满足了我们对于下载一个文件的需求。
同时,我们可以监听文件下载完成来进行后续的操作。DownLoadManager在文件现在完成时会发送一个action为ACTION_DOWNLOAD_COMPLETE的广播,所以我们可以注册BroadcastReceiver来监听:

1
2
3
4
5
6
7
8
private class DownLoadCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)){
Toast.makeText(DownloadManagerActivity.this, "下载任务已经完成!", Toast.LENGTH_SHORT).show();
}
}
}

获取下载信息

我们可以通过DownManager.Query对象来查询所有下载任务信息。
setFilterById(long… ids)根据任务编号查询下载任务信息
setFilterByStatus(int flags)根据下载状态查询下载任务

在这里我就不再展开了。