DownloadManager实现文件下载

2023-11-03 14:40

本文主要是介绍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() {@Overridepublic 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,这样我们实现了文件的下载和打开。

小结

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

这篇关于DownloadManager实现文件下载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/338868

相关文章

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

Flask 验证码自动生成的实现示例

《Flask验证码自动生成的实现示例》本文主要介绍了Flask验证码自动生成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录生成图片以及结果处理验证码蓝图html页面展示想必验证码大家都有所了解,但是可以自己定义图片验证码

VSCode配置Anaconda Python环境的实现

《VSCode配置AnacondaPython环境的实现》VisualStudioCode中可以使用Anaconda环境进行Python开发,本文主要介绍了VSCode配置AnacondaPytho... 目录前言一、安装 Visual Studio Code 和 Anaconda二、创建或激活 conda

使用mvn deploy命令上传jar包的实现

《使用mvndeploy命令上传jar包的实现》本文介绍了使用mvndeploy:deploy-file命令将本地仓库中的JAR包重新发布到Maven私服,文中通过示例代码介绍的非常详细,对大家的学... 目录一、背景二、环境三、配置nexus上传账号四、执行deploy命令上传包1. 首先需要把本地仓中要

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

《MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固通俗易懂版)》本文主要讲解了MySQL中的多表查询,包括子查询、笛卡尔积、自连接、多表查询的实现方法以及多列子查询等,通过实际例子和操... 目录复合查询1. 回顾查询基本操作group by 分组having1. 显示部门号为10的部门名,员

java导出pdf文件的详细实现方法

《java导出pdf文件的详细实现方法》:本文主要介绍java导出pdf文件的详细实现方法,包括制作模板、获取中文字体文件、实现后端服务以及前端发起请求并生成下载链接,需要的朋友可以参考下... 目录使用注意点包含内容1、制作pdf模板2、获取pdf导出中文需要的文件3、实现4、前端发起请求并生成下载链接使

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

Linux下修改hostname的三种实现方式

《Linux下修改hostname的三种实现方式》:本文主要介绍Linux下修改hostname的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下修改ho编程stname三种方式方法1:修改配置文件方法2:hFvEWEostnamectl命

Java实现数据库图片上传功能详解

《Java实现数据库图片上传功能详解》这篇文章主要为大家详细介绍了如何使用Java实现数据库图片上传功能,包含从数据库拿图片传递前端渲染,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、数据库搭建&nbsChina编程p; 3、后端实现将图片存储进数据库4、后端实现从数据库取出图片给前端5、前端拿到