热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

DownloadManager实现文件下载功能

这篇文章主要为大家详细介绍了DownloadManager实现文件下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

    关于文件下载,或许不是一个多么陌生的内容,在网络操作中下载只是其中一个方面,但是关于文件下载还是有不少东西要说,今天我就拿下载的方式来说吧。 

    文件下载有许多方式,比如什么多线程下载,单线程下载等等,我刚开始接触文件下载的时候是看了一个《关于文件多线程下载原理》的一个视频,里面讲了什么是多线程下载,然后就是自己写一个下载类,实现文件下载,虽然最后也是能够实现下载,但是效果并不是多么的好,有时候文件无法下载成功,那时候我就想应该有封装好的工具来帮助实现下载。确实,后来百度了一下,我找到许多的第三方jar包来实现下载,其中Afinal框架是我一直在用的,还不错。不想每一次都是用第三方的东西,android系统应该自己拥有下载的工具类,然后就是我们今天要讲的 DownloadManager了。 

    接触DownloadManager是因为我前一段时间在写自己的一个音乐播放器,需要从网络获取歌曲并下载,这个时候我就想找一个简单是用的下载方式然后就认识了它,关于它的使用我还没做具体的深究,只是把它用在了自己的应用里面,现在写出来分享一下当时是怎么做的。

实现

    下载我主要关心三个方面的内容:

从哪来
到哪去
完成之后的操作

    这三方面的内容就是最重要的,下面我就下载一首歌来进行说明: 

    我们首先需要得到DownloadManager的一个实例,它既然是系统提供的服务,自然需要用getSystemService来得到了。
    DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
    得到manager对象之后我们就需要一个下载请求,把下载的信息(也即“从哪来”,“到哪去”)设置进去。下载请求是DownloadManager的一个内部类Request,我们先生成Request的对象:DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));可以看到Request的一个构造函数传入的是一个Uri对象,我们调用Uri的静态方法来根据下载的Url得到一个Uri对象,这也就是我们说的”从哪来“。 

    下面还有三个Request的三个方法需要我们调用:

setTitle(String title)
setDescription(String desc)
setNotificationVisibility(int flag)

    其中setTitle是设置下载的标题,setDescription设置下载描述,示例图如下:

这里写图片描述

    其中”Nobody“是标题,“WonderGirls”是描述。 

    setNotificationVisibility方法就需要好好说说了,它的参数有四种情况:

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权限。

    我们根据需要选择合适的参数,如果我们不希望下载的时候显示进度,那么我们就可以设置Request.VISIBILITY_HIDDEN,这样在下载的时候我们就看不到通知了,不过这样的坏处是我们就无法知道下载是否成功了。

    “从哪来”的问题解决了,现在我们来看“到哪去”的问题:setDestinationUri这个函数用来设置下载路径,参数是一个Uri对象,使用如下:

String path = "/storage/sdcard1/music/许嵩 - 幻听.mp3";
 File file = new File(path);
 Uri uri = Uri.fromFile(file);
 request.setDestinationUri(uri);

这样我们就设置好了下载的路径。 

    Request设置好了之后我们就可以调用manager的方法开始下载了:
    manager.enqueue(request);这个方法就是把下载请求放到一个队列里面然后就开始下载,它有一个返回值,这个返回值是一个下载id,用来唯一标示这一次的下载,在下面我们会用到这个id,我们把它记为mDownloadID;

    最后就剩下载完成之后的情况了,下载完成之后我们可能还会有操作,比如下载完成之后打开文件等等,就像我们看到了一些软件进行升级,下载完成apk文件之后就直接打开安装,这都是下载完成之后的操作,那么该如何实现呢?

    原来DownloadManager在下载完成之后会发送一个广播,我们只需要注册一个广播接收器得到广播就可以进行我们自己的操作了。

IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
 BroadcastReceiver receiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
   long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
   if (mDownloadID == reference){
    Intent i = new Intent();
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.setAction(Intent.ACTION_VIEW);
    String type = "application/vnd.android.package-archive";
    i.setDataAndType(Uri.fromFile(file),type);
    mContext.startActivity(i);
   }
  }
 };
 mContext.registerReceiver(receiver, filter);

    这样我们就自己注册了一个广播接收器,用来接收下载完成之后发送的广播,接收到之后我们就直接打开文件,在代码中,我设置的是打开apk文件,即设置文件类型为”application/vnd.android.package-archive“,其中mDownloadID就是我们得到的那个下载ID,这样我们实现了文件的下载和打开。

小结

    这样看来文件下载并不是多么的复杂,当然我们只是站在用代码的角度,如果让我们自己去写下载源码,呵呵,无能为力了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • 过去我习惯使用百度空间来记录个人的生活琐事,但随着需求的增长,我发现它的功能略显不足,特别是在代码分享和图片管理方面存在诸多不便。因此,我决定寻找一个更适合技术分享的平台,最终选择了博客园。 ... [详细]
  • HDU 2537 键盘输入处理
    题目描述了一个名叫Pirates的男孩想要开发一款键盘输入软件,遇到了大小写字母判断的问题。本文提供了该问题的解决方案及实现方法。 ... [详细]
  • 本文探讨了如何通过JavaScript检测鼠标是否离开了浏览器窗口,包括使用原生方法和第三方库的不同解决方案。 ... [详细]
  • ACM经典书籍推荐
    本文介绍了几本在算法和计算机科学领域具有重要影响力的书籍,包括由Donald E. Knuth编著的《计算机程序设计艺术》第一卷,以及潘氏兄弟的数论经典教材等。这些书籍不仅是学习相关领域的宝贵资源,也是专业人士不可或缺的参考书。 ... [详细]
  • 面对众多的数据分析工具,如何选择最适合自己的那一个?对于初学者而言,了解并掌握几种核心工具是快速入门的关键。本文将从数据处理的不同阶段出发,推荐三种广泛使用的数据分析工具。 ... [详细]
  • 本文探讨了在AspNetForums平台中实施基于角色的权限控制系统的方法,旨在为不同级别的用户提供合适的访问权限,确保系统的安全性和可用性。 ... [详细]
  • 本文总结了 #define 在 C/C++ 编程中的多种用途和技巧,包括定义常量、函数、宏以及条件编译等,并提供了详细的示例和注意事项。 ... [详细]
  • Excel技巧:单元格中显示公式而非结果的解决方法
    本文探讨了在Excel中如何通过简单的方法解决单元格显示公式而非计算结果的问题,包括使用快捷键和调整单元格格式两种方法。 ... [详细]
  • 解决UIScrollView自动偏移问题的方法
    本文介绍了一种有效的方法来解决在使用UIScrollView时出现的自动向下偏移的问题,通过调整特定的属性设置,可以确保滚动视图正常显示。 ... [详细]
  • 如何高效渲染JSON数据
    本文介绍了在控制器中返回JSON结果的方法,并详细说明了如何利用jQuery处理和展示这些数据,为Web开发提供了实用的技巧。 ... [详细]
  • Awk是一款功能强大的文本分析与处理工具,尤其在数据解析和报告生成方面表现突出。它通过读取由换行符分隔的记录,并按照指定的字段分隔符来划分和处理这些记录,从而实现复杂的数据操作。 ... [详细]
  • 随着Linux操作系统的广泛使用,确保用户账户及系统安全变得尤为重要。用户密码的复杂性直接关系到系统的整体安全性。本文将详细介绍如何在CentOS服务器上自定义密码规则,以增强系统的安全性。 ... [详细]
  • 本文介绍了通过ADB命令查询Android设备CPU的当前频率、最小频率和最大频率的方法。 ... [详细]
author-avatar
白白加黑黑99_889
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有