DownloadManager 文件下载

来源:互联网 发布:淘宝买托福答案被骗 编辑:程序博客网 时间:2024/06/03 23:00

一、Download模块简介

首先,Android Download模块主要由两个部分构成:DownloadManager以及DownloadProvider。
DownloadManager:在Android L/M源码位置:frameworks/base/core/java/android/app/DownloadManager.java作用:提供接口供三方apk调用
DownloadManager在Android L/M源码位置:packages/providers/DownloadProvider/作用:具体下载的实现,包括相关文件下载信息的保存以及文件的下载。
二、DownloadManager介绍

1、静态内部类

DownloadManager是系统开放给第三方应用使用的类,包含两个静态内部类 -DownloadManager.Query和DownloadManager.Request。

DownloadManager.Request用来请求一个下载
DownloadManager.Query 用来查询下载信息
2、主要方法

DownloadManager主要提供了一下主要方法:

enqueue(Request request):执行下载,返回downloadId,downloadId可用于查询下载信息。
remove(long ids):删除下载,若下载中取消下载。会同时删除下载文件和记录。
query(Query query)查询下载信息
getMaxBytesOverMobile(Context context)通过移动网络下载的最大字节数
getMimeTypeForDownloadedFile(long id)得到下载的mineType
三、DownloadProvider分析

1、DownloadManager主要类介绍

DownloadProvider:将下载信息insert到DB,启动下载服务类DownloadService
DownloadService:下载服务类,调用下载信息类DownlaodInfo,如果信息存在,则更新;否则,则新建该对象
DownloadInfo:下载信息类,启动下载线程类DownloadThread
DownloadThread:下载线程类,真正负责下载的线程,每次启动一个任务都会创建一个新的下载线程对象。进行下载前的过程检查、网络监测、路径检查等,保存文件……

例子

final DownloadManager dManager = (DownloadManager) getActivity().getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri = Uri.parse(“http://192.168.1.120:8080/mvp/com.goview.meineng_2.0.0_20.apk“);
//设置允许使用的网络类型,这里是移动网络和wifi都可以
DownloadManager.Request request = new DownloadManager.Request(uri);
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE|DownloadManager.Request.NETWORK_WIFI);
//显示在下载界面,即下载后的文件在系统下载管理里显示
request.setVisibleInDownloadsUi(true);
//设置下载标题
request.setTitle(“meineng”);
//显示Notification
// request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
// 设置下载路径和文件名
request.setDestinationInExternalPublicDir(“download”, “com.goview.meineng_2.0.0_20.apk”);
request.setDescription(“软件新版本下载”);
request.setMimeType(“application/vnd.android.package-archive”);
// 设置为可被媒体扫描器找到
request.allowScanningByMediaScanner();
// 获取此次下载的ID
final long refernece = dManager.enqueue(request);

    // 注册广播接收器,当下载完成时自动安装    IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);    BroadcastReceiver receiver = new BroadcastReceiver() {        public void onReceive(Context context, Intent intent) {            long myDwonloadID = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);            if (refernece == myDwonloadID) {                Intent install = new Intent(Intent.ACTION_VIEW);                Uri downloadFileUri = dManager.getUriForDownloadedFile(refernece);                install.setDataAndType(downloadFileUri, "application/vnd.android.package-archive");                install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                startActivity(install);            }        }    };    getActivity().registerReceiver(receiver, filter);

可以静态注册一个广播