返回

DownloadManager 详解以及简单封装

Android

前言

在 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 类来实现文件下载功能。