随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)
DownloadManager是一个下载管理器,对文件下载进行了封装,我们不用在写代码去请求资源,也不用去处理通知栏逻辑,使用起来非常方便:
/**
* 下载文件(封装了通知栏进度、下载提示、点击安装、异常处理和断点续传逻辑)
*
* @param context
* 上下文对象
* @param urlStr
* 文件url地址
* @param downloadDir
* 本地保存的目录
* @param fileName
* 文件名
* @param title
* 通知栏提示的标题
* @param description
* 通知栏提示的介绍
* @return 下载id
*/
public static long downFile(Context context, String urlStr,
String downloadDir, String fileName, String title,
String description) {
DownloadManager dm = SystemService.getDownloadManager(context);
DownloadManager.Request request = new DownloadManager.Request(
Uri.parse(urlStr));
// 设置下载后存储目录和文件名
request.setDestinationInExternalPublicDir(downloadDir, fileName);
// 表示允许MediaScanner扫描到这个文件,默认不允许
request.allowScanningByMediaScanner();
// 设置下载中通知栏提示的标题
if (DataUtil.isEmpty(title))
title = "安装包下载";
request.setTitle(title);
// 设置下载中通知栏提示的介绍
if (DataUtil.isEmpty(description))
description = "安装包正在下载中";
request.setDescription(description);
// 表示下载完成后显示通知栏提示
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
return dm.enqueue(request);
}
另外通过下载id,还可以查询其他东西,不一一介绍了,同时可以注册一个广播用来监听下载完成事件,有时候下载完成需要做一些逻辑处理:
package com.home.receiver;
import java.io.File;
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.home.util.APKUtil;
import com.home.util.FileUtil;
import com.home.util.SharedUtil;
public class DownCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
long curDownId = SharedUtil.getLong(context, "data", "downId", -1);
String fileName = SharedUtil.getString(context, "data", "fileName");
long downId = intent
.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if (curDownId == downId) {
APKUtil.installAPK(context, FileUtil.getRootPath() + File.separator
+ fileName);
}
}
}