返回
DownloadManager 详解以及简单封装
Android
2023-12-23 22:17:21
前言
在 Android 开发中,经常会遇到需要从网络下载文件的场景。系统提供了 DownloadManager
类来帮助开发者管理下载任务。该类提供了许多有用的方法来创建、管理、查询和取消下载任务。还支持使用通知来跟踪下载进度和状态。
DownloadManager 详解
DownloadManager
类是一个系统服务,它提供了以下功能:
- 创建下载任务。
- 管理下载任务,包括暂停、恢复和取消任务。
- 查询下载任务的状态。
- 使用通知来跟踪下载进度和状态。
- 允许其他应用程序请求下载权限。
创建下载任务
要创建下载任务,可以使用 enqueue()
方法。该方法需要一个 Request
对象作为参数,Request
对象包含了下载任务的相关信息,包括:
- 下载文件的 URL。
- 下载文件的保存路径。
- 下载文件的 MIME 类型。
- 是否允许漫游时下载。
- 是否显示通知。
// 创建一个下载请求
DownloadManager.Request request = new DownloadManager.Request(Uri.parse("https://example.com/file.apk"));
// 设置下载文件的保存路径
request.setDestinationUri(Uri.parse("file:///sdcard/Download/file.apk"));
// 设置下载文件的 MIME 类型
request.setMimeType("application/vnd.android.package-archive");
// 允许漫游时下载
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
// 显示通知
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
// 获取下载管理器实例
DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
// 使用 enqueue() 方法创建下载任务
downloadManager.enqueue(request);
管理下载任务
创建下载任务后,可以使用 DownloadManager
类提供的各种方法来管理任务。这些方法包括:
pauseDownload()
:暂停下载任务。resumeDownload()
:恢复暂停的下载任务。cancelDownload()
:取消下载任务。query()
:查询下载任务的状态。
// 获取下载任务的状态
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(downloadId);
List<DownloadManager.Status> statuses = downloadManager.query(query);
if (statuses.size() > 0) {
DownloadManager.Status status = statuses.get(0);
// 获取下载任务的状态
int state = status.getStatus();
// 获取下载任务的总大小
long totalSize = status.getTotalBytes();
// 获取下载任务的当前大小
long currentSize = status.getBytesSoFar();
}
查询下载任务
可以使用 query()
方法来查询下载任务的状态。该方法可以根据下载任务的 ID、URI 或状态来查询任务。查询结果是一个 Cursor
对象,其中包含了下载任务的各种信息,包括:
- 下载任务的 ID。
- 下载任务的 URI。
- 下载任务的状态。
- 下载任务的总大小。
- 下载任务的当前大小。
- 下载任务的下载速度。
- 下载任务的开始时间。
- 下载任务的结束时间。
// 获取下载任务的状态
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(downloadId);
List<DownloadManager.Status> statuses = downloadManager.query(query);
if (statuses.size() > 0) {
DownloadManager.Status status = statuses.get(0);
// 获取下载任务的状态
int state = status.getStatus();
// 获取下载任务的总大小
long totalSize = status.getTotalBytes();
// 获取下载任务的当前大小
long currentSize = status.getBytesSoFar();
}
取消下载任务
可以使用 cancelDownload()
方法来取消下载任务。该方法需要一个下载任务的 ID 作为参数。
// 取消下载任务
downloadManager.cancelDownload(downloadId);
使用通知来跟踪下载进度和状态
DownloadManager
类提供了通知功能来跟踪下载进度和状态。当下载任务的状态发生变化时,系统会发出通知。应用程序可以注册一个 BroadcastReceiver
来接收这些通知。
// 注册一个 BroadcastReceiver 来接收下载任务的状态变化通知
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
// 获取下载任务的状态
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(downloadId);
List<DownloadManager.Status> statuses = downloadManager.query(query);
if (statuses.size() > 0) {
DownloadManager.Status status = statuses.get(0);
// 获取下载任务的状态
int state = status.getStatus();
// 获取下载任务的总大小
long totalSize = status.getTotalBytes();
// 获取下载任务的当前大小
long currentSize = status.getBytesSoFar();
// 更新 UI 以显示下载进度
}
}
};
// 注册 BroadcastReceiver
registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
DownloadManager 简单封装
为了简化 DownloadManager
类的使用,可以创建一个简单的封装类。该封装类可以提供一些有用的方法,例如:
- 创建下载任务。
- 暂停下载任务。
- 恢复暂停的下载任务。
- 取消下载任务。
- 查询下载任务的状态。
- 使用通知来跟踪下载进度和状态。
public class DownloadManagerHelper {
private DownloadManager downloadManager;
public DownloadManagerHelper(Context context) {
downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
}
public long enqueue(String url, String destinationPath) {
// 创建一个下载请求
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
// 设置下载文件的保存路径
request.setDestinationUri(Uri.parse(destinationPath));
// 设置下载文件的 MIME 类型
request.setMimeType("application/vnd.android.package-archive");
// 允许漫游时下载
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
// 显示通知
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
// 创建下载任务
return downloadManager.enqueue(request);
}
public void pauseDownload(long downloadId) {
downloadManager.pauseDownload(downloadId);
}
public void resumeDownload(long downloadId) {
downloadManager.resumeDownload(downloadId);
}
public void cancelDownload(long downloadId) {
downloadManager.cancelDownload(downloadId);
}
public DownloadManager.Status query(long downloadId) {
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(downloadId);
List<DownloadManager.Status> statuses = downloadManager.query(query);
if (statuses.size() > 0) {
return statuses.get(0);
}
return null;
}
public void registerReceiver(BroadcastReceiver receiver) {
IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
context.registerReceiver(receiver, filter);
}
public void unregisterReceiver(BroadcastReceiver receiver) {
context.unregisterReceiver(receiver);
}
}
结语
DownloadManager
类是一个功能强大的工具,它可以帮助开发者轻松管理下载任务。本文详细介绍了 DownloadManager
类的使用方法,并提供了一个简单的封装类来简化其使用。希望本文能够帮助开发者更好地使用 DownloadManager
类来实现文件下载功能。