DownloadManager使用详解

来源:互联网 发布:演唱会app软件推荐 编辑:程序博客网 时间:2024/05/22 03:19

今日科技快讯

昨天,美国大选的结果出炉,特朗普出人意料地逆袭了希拉里,成为了美国的第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

更多

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

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

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子学习静不下心怎么办 退烧后体温35度怎么办 孩子体温34度多怎么办 宝宝感冒咳嗽流鼻涕出汗怎么办 养的小鸡总打架怎么办 小鸡一条腿瘸了怎么办 同窝小斗鸡打架怎么办 夏季羊长的慢怎么办 1岁吃母乳不吃饭怎么办 5个月宝宝黏妈妈怎么办 九个月宝宝不爱吃饭怎么办 20个月宝宝吐了怎么办 十个月的宝宝消化不好怎么办 两岁宝宝不爱喝水怎么办 两岁宝宝不爱喝水吃饭怎么办 两岁的宝宝不爱喝水怎么办 宝宝不爱吃饭不爱喝水怎么办 一多半宝宝爱喝水 不爱吃饭怎么办 1岁宝宝不爱吃饭喝水怎么办 两岁小宝宝不爱吃饭怎么办 4个月小宝宝咳嗽怎么办 3个月小宝宝咳嗽怎么办 2个月小宝宝咳嗽怎么办 8的岁儿童腿不直怎么办 作业盒子选错年级怎么办 两岁x型腿怎么办 绿萝叶子有水滴怎么办 打游戏变菜了怎么办 车被记号笔画了怎么办 水溶性彩铅受潮了怎么办 马克笔颜色涂深了怎么办 染发膏染眉毛了怎么办 用电容笔画画手有触感怎么办 CAD画图线性数字不居中怎么办 3d立体画笔堵塞怎么办 龋齿树脂填充老化后怎么办 小孩补过的牙疼怎么办 颜料弄到墙纸上怎么办 4岁的宝宝不爱涂色怎么办 oppo手机截图存不到相册怎么办 做的ih5保存不了怎么办