从Android2.3(API level 9)开始Android用系统服务(Service)的方式提供了Download Manager来优化处理长时间的下载操作。
Download Manager处理HTTP连接并监控连接中的状态变化以及系统重启来确保每一个下载任务顺利完成。在大多数涉及到下载的情况中使用Download Manager都是不错的选择,特别是当用户切换不同的应用以后下载需要在后台继续进行,以及当下载任务顺利完成非常重要的情况(DownloadManager对于断点续传功能支持很好)。
简单的使用方法
//创建下载任务,downloadUrl就是下载链接
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadUrl));
//指定下载路径和下载文件名
request.setDestinationInExternalPublicDir("/download/", fileName);
//获取下载管理器
DownloadManager downloadManager= (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
//将下载任务加入下载队列,否则不会进行下载
downloadManager.enqueue(request);
使用的时候需要添加权限
Download Manager简介
DownloadManager是系统开放给第三方应用使用的类,包含两个静态内部类:
DownloadManager.Request:用来请求一个下载
DownloadManager.Query:用来查询下载信息,这两个类的具体功能会在后面穿插介绍。
**使用Download Manager 流程: **
1.创建一个下载Request
2.将创建的Request添加到Download Manager 就好了
DownloadManager主要提供了下面几个接口:
public long enqueue(Request request):执行下载,返回downloadId,downloadId可用于后面查询下载信息。若网络不满足条件、Sdcard挂载中、超过最大并发数等异常会等待下载,正常则直接下载。
public int remove(long… ids)删除下载,若下载中取消下载。会同时删除下载文件和记录。
首先创建一个下载请求 ------DownloadManager.Request
DownloadManager.Request除了构造函数的Uri外,其他设置都为可选设置;
1.创建Request
//downUrl为下载地址
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downUrl));
通过源代码可以看出开 只能下载HTTP或者HTTPS的URI
2.指定下载路径和下载文件名
该方法比较常用
//sdcard的目录下的download文件夹,必须设置;downFileName为保存文件名
//当路径中该文件已经存在时,会自动以迭代的方式命名。
request.setDestinationInExternalPublicDir("/download/", downFileName);
从源码中我们可以看出下载完整目录为
Environment.getExternalStoragePublicDirectory(dirType)。
不过在在API17(4.2)及以前版本中file是通过file.mkdir()创建的,这样如果上级目录不存在就会新建文件夹异常。所以版本兼容到4.2及以前的,在下载前我们最好自己调用File的mkdirs方法递归创建子目录,如下:
File folder = new File(folderName);
return (folder.exists() && folder.isDirectory()) ? true : folder.mkdirs();
其他设置下载路径接口:为setDestinationUri,setDestinationInExternalFilesDir,setDestinationToSystemCache。其中setDestinationToSystemCache仅限系统app使用。
以上四个方法中除了setDestinationToSystemCache是系统app使用外,其他三个方法最终也都是设置下载的目标URI;
3. 设置不同网络状态是否下载
//只有允许WIFIi下载
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
表示下载允许的网络类型,默认在任何网络下都允许下载。
有NETWORK_MOBILE、NETWORK_WIFI、NETWORK_BLUETOOTH三种及其组合可供选择。如果只允许wifi下载,而当前网络为3g,则下载会等待。
Android API level 11 介绍了getRecommendedMaxBytesOverMobile类方法(静态方法),返回一个当前手机网络连接下的最大建议字节数,可以来判断下载是否应该限定在WiFi条件下。
//移动网络情况下是否允许漫游。默认是true
request.setAllowedOverRoaming(boolean allow)
4.设置下载中通知栏提示
//默认只显示下载中通知
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
表示下载进行中和下载完成的通知栏是否显示。
Request.VISIBILITY_VISIBLE:在下载进行的过程中,通知栏中会一直显示该下载的Notification,当下载完成时,该Notification会被移除,这是默认的参数值。
Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED:在下载过程中通知栏会一直显示该下载的Notification,在下载完成后该Notification会继续显示,直到用户点击该Notification或者消除该Notification。
Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION:只有在下载完成后该Notification才会被显示。
Request.VISIBILITY_HIDDEN:不显示该下载请求的Notification。如果要使用这个参数,需要在应用的清单文件中加上DOWNLOAD_WITHOUT_NOTIFICATION权限。
注:该方法只支持API 11及以后(3.0),若在API 9 和API 10中可以用
//在API 11以后被标记为@Deprecated
request.setShowRunningNotification(boolean show);
//下载任务标题
request.setTitle(“Earthquakes”);
//下载文件描述
request.setDescription(“Earthquake XML”);
5.设置文件类型,可以在下载结束后自动打开该文件
我们可以通过addRequestHeader方法为DownloadManager.Request对象request添加HTTP头;
也可以通过setMimeType方法重写从服务器返回的mime type,设置下载文件的mineType。因为下载管理Ui中点击某个已下载完成文件及下载完成点击通知栏提示都会根据mimeType去打开文件,所以我们可以利用这个属性。比如上面设置了mimeType为application/cn.trinea.download.file,我们可以同时设置某个Activity的intent-filter为application/cn.trinea.download.file,用于响应点击的打开文件。
6.是否允许MediaScanner扫描到这个文件
//表示允许MediaScanner扫描到这个文件,默认不允许。
request.allowScanningByMediaScanner();
7.如果我们希望下载的文件可以被系统的Downloads应用扫描到并管理
request.setVisibleInDownloadsUi(boolean isVisible); 默认是允许的。
8.是否允许“计量式的网络连接”执行下载操作
//不太明白这个是干嘛的 一般的时候使用默认的就好了
request.setAllowedOverMetered(boolean); 默认是允许的。
DownloadManager.Request的常用方法就这些了
android 系统下载 Download Manager(二)Download Manager使用详情