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

相关文章

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

MySQL 横向衍生表(Lateral Derived Tables)的实现

《MySQL横向衍生表(LateralDerivedTables)的实现》横向衍生表适用于在需要通过子查询获取中间结果集的场景,相对于普通衍生表,横向衍生表可以引用在其之前出现过的表名,本文就来... 目录一、横向衍生表用法示例1.1 用法示例1.2 使用建议前面我们介绍过mysql中的衍生表(From子句

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

MYSQL查询结果实现发送给客户端

《MYSQL查询结果实现发送给客户端》:本文主要介绍MYSQL查询结果实现发送给客户端方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql取数据和发数据的流程(边读边发)Sending to clientSending DataLRU(Least Rec

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构