专栏名称: 郭霖
Android技术分享平台,每天都有优质技术文章推送。你还可以向公众号投稿,将自己总结的技术心得分享给大家。
目录
相关文章推荐
郭霖  ·  从源码到定制:全面解析 Android ... ·  2 天前  
鸿洋  ·  卡顿监测的方方面面 ·  2 天前  
郭霖  ·  HarmonyOS ... ·  4 天前  
鸿洋  ·  大图检测插件的落地 ·  3 天前  
鸿洋  ·  打造Android热修复专家 ·  6 天前  
51好读  ›  专栏  ›  郭霖

DownloadManager使用详解

郭霖  · 公众号  · android  · 2016-11-10 08:00

正文

今日科技快讯

昨天,美国大选的结果出炉,特朗普出人意料地逆袭了希拉里,成为了美国的第45位总统。由于全球各界人士都认为特朗普将会是个不靠谱的总统,人们的避险情绪增加,昨天全球股市及美元指数大跌,黄金暴涨。而另一方面,希拉里在08年竞选总统候选人的时候就被奥巴马打败,这次8年之后卷土重来又被特朗普打败,已经年近70岁的希拉里总统梦终归破碎,美国的第一位女总统不知何年何月才会出现了。

作者简介

本篇是 xingfeng_coder 的第二篇投稿,总结了使用DownloadManger的正确姿势,希望对大家有所帮助。

xingfeng_coder 的博客地址:

http://blog.csdn.net/qq_19431333

概述

DownloadManager 是处理长时间HTTP下载的系统服务。客户端可以将指定内容下载到某一特定的目录。DownloadManager 会在后台进行下载工作,自己会处理下载失败、网络变换或系统重启等问题。可以通过下面的方法获取到 DownloadManager 对象,代码如下:

DownloadManager mDownloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);

一般使用 DownloadManager 时,应用需要注册一个可以接受 ACTION_NOTIFICATION_CLICKED 的广播接收器,用于恰当处理用户点击通知栏中的下载界面时的情形。另外,当使用 DownloadManager 时应用需要应具有 INTERNET权限

如何使用DownloadManager

DownloadManager 一般用于软件更新、视频等的的下载任务,在通知栏中可以看到一个下载进度条,这种情形一般都是通过 DownloadManager 实现的。使用步骤由如下几步:

初始化DownloadManager.Request对象

DownloadManager.Request类 包含了一个下载请求的所有必要信息。构造方法中只需要传入下载的URI,默认的文件存储地址是一个共享卷,当系统需要回收空间时可以能会删除下载文件。如果需要避免这种情况,可以使用 setDestinationUrl(Uri) 设置外部存储路径。

Request 可以设置限制使用的网络,默认是移动网络和WIFI网络均可以,如果想只设置WIFI网络,可以使用 setAllowedNetWorkTypes 进行设置,代码如下:

request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);

Request可以设置是否将下载进度显示在通知栏中,可以通过 setNotificationVisibility(int visibility) 进行设置。默认的,只会在下载进行中时显示,在下载完成后就不显示了。可以设置如下值:

  • VISIBILITY_HIDDEN 下载UI不会显示,也不会显示在通知中,如果设置该值,需要声明 Android.permission.DOWNLOAD_WITHOUT_NOTIFICATION

  • VISIBILITY_VISIBLE 当处于下载中状态时,可以在通知栏中显示;当下载完成后,通知栏中不显示

  • VISIBILITY_VISIBLE_NOTIFY_COMPLETED 当处于下载中状态和下载完成时状态,均在通知栏中显示

  • VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION 只在下载完成时显示在通知栏中

Request 还有一些设置HTTP请求的方法,比如 添加请求头addRequestHeader、设置MIME类型setMimeType等方法。

下面是一段创建Request的示例代码:


上面的代码中根据 下载的URL 转成 URI 之后再创建 Request对象,然后设置只允许使用WIFI网络,当任务在下载中时会在通知栏中显示进度,setTitle 是设置通知的标题。

发送Request对象

当创建好Request对象后,只需要调用 DownloadManager 的 enqueue(DownloadRequest request) 方法将请求放入队列中,然后只要 DownloadManager 准备好执行该任务时就会自动执行,用户就不需要关心下载过程了。 enqueue对象 返回一个唯一的id号,以后就可以通过这个id与该下载请求关联进行查询等操作。调用enqueue对象如下所示:

id = mDownloadManager.enqueue(request);

当提交之后,运行效果如下:

创建Query对象查询下载进度

当需要查询下载进度或状态时,可以创建 DownloadManager.Query 对象,然后再调用 DownloadManager.query 方法进行查询,该方法返回一个 Cursor对象,具体需要查询哪个字段可以查看 DownloadManager 的以 COLUM_** 开头的常量。创建 Query对象 后,可以根据id或者下载状态设置过滤条件。下面是一个查询示例:


上面的代码是根据id设置的过滤条件,查询了一些字段,然后将其打到Log上,结果如下:


取消下载任务

如果下载任务进行了一半之后,用户想取消该如何实现呢?可以通过 DownloadManager 的 remove方法,传入 enqueue 返回的 id 即可。

注册广播监听通知栏点击事件和下载完成事件

当点击通知栏中的下载栏时,系统会发出 ACTION_NOTIFICATION_CLICKED 事件的广播,当下载完成时,系统会发出 ACTION_DOWNLOAD_COMPLETE 事件的广播,可以通过实现接受这样 ACTION 的广播处理一些事情。比如应用本来是后台下载,但是点击该按钮后,就弹出正在下载的对话框;应用下载好后,可以直接执行安装操作。下面的代码展示了如何实现这样的一个广播接收器:


在上面的代码中,对于 ACTION_NOTIFICATION_CLICKED 广播,仅仅是显示Toast提示,当然可以在这儿做一些更复杂的操作;对于 ACTION_DOWNLOAD_COMPLETE 广播,因为上面下载的图片,所以完成后就直接给ImageView设置了。接下来就是需要注册广播接收器和在Activity销毁的时候解除广播接收器。

结果如下图:

总结

DownloadManager的好处在于:

  • 后台执行网络操作,开发者无需关注网络切换、存储文件失败等问题

  • 在通知栏中显示下载进度,不需要开发者自己实现通知栏中的下载进度条

  • 可以很方便地进行查询和删除任务的功能

代码地址:

https://github.com/wangli135/BlogDemo/tree/master/downloadmanager

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都会有好心情。

如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号: