Android DownloadManager 多任务下载的实现

在 Android 开发中,DownloadManager 是一个非常方便的工具,它可以帮助我们简化下载任务的管理。对于初学者来说,实现多任务下载可能会显得有些复杂,但其实只要按照正确的步骤进行,就能轻松实现。本文将详细讲解如何使用 DownloadManager 实现多任务下载,并为您提供相应的代码示例和说明。

整体流程

实现 DownloadManager 多任务下载的整体流程如下表所示:

步骤 描述
1 在 Manifest 中声明权限
2 创建 DownloadManager 对象
3 构建下载请求
4 通过 DownloadManager 开始下载
5 监控下载状态
6 处理下载完成后的逻辑

Gantt 图展示项目重要活动时间安排

gantt
    title DownloadManager 多任务下载开发计划
    dateFormat  YYYY-MM-DD
    section 开发准备
    声明权限           :a1, 2023-10-01, 2d
    创建 DownloadManager :after a1  , 2d
    section 下载任务实现
    构建下载请求            :after a1, 3d
    开始下载               :after a1, 2d
    监控下载状态           :after a1, 2d
    处理后续操作           :after a1, 3d

步骤详解

1. 在 Manifest 中声明权限

在项目的 AndroidManifest.xml 文件中添加网络访问和写入外部存储的权限。

<manifest xmlns:android="
    package="com.example.downloadmanager">

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        ...
    </application>
</manifest>
  • INTERNET: 允许应用访问互联网。
  • WRITE_EXTERNAL_STORAGE: 允许应用写入外部存储。

2. 创建 DownloadManager 对象

在你的 Activity 中创建 DownloadManager 对象。

DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
  • getSystemService 方法用于获取系统服务,返回当前的 DownloadManager 实例。

3. 构建下载请求

使用 DownloadManager.Request 构建下载请求。设置需要下载的 URL、文件名和其他属性。

Uri downloadUri = Uri.parse("
DownloadManager.Request request = new DownloadManager.Request(downloadUri);

// 设置通知和状态的信息
request.setTitle("Downloading File");
request.setDescription("File is downloading...");
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

// 设置文件保存路径
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "file.zip");
  • setTitlesetDescription: 设置下载过程中的通知标题和描述。
  • setNotificationVisibility: 设置通知的可见性。
  • setDestinationInExternalPublicDir: 设置文件的保存位置。

4. 通过 DownloadManager 开始下载

使用 DownloadManager 开始下载,并获取下载的 ID。

long downloadId = downloadManager.enqueue(request);
  • enqueue(request): 将下载请求添加到下载队列,并开始下载。返回下载的 ID。

5. 监控下载状态

你可以通过 BroadcastReceiver 来监听下载状态。创建一个 Receiver,用于处理下载完成的广播。

BroadcastReceiver onDownloadComplete = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
        
        // 检查下载是否完成和成功
        DownloadManager.Query query = new DownloadManager.Query();
        query.setFilterById(id);
        Cursor cursor = downloadManager.query(query);
        
        if (cursor.moveToFirst()) {
            int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
            if (status == DownloadManager.STATUS_SUCCESSFUL) {
                // 下载成功,处理相应逻辑
                Toast.makeText(context, "Download complete!", Toast.LENGTH_SHORT).show();
            }
        }
        cursor.close();
    }
};

// 注册 Receiver
registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
  • onReceive: 当下载完成时,此方法被调用。
  • DownloadManager.Query: 创建查询以获取有关下载的详细信息。

6. 处理下载完成后的逻辑

在下载完成后,您可以在 onReceive 方法中处理相应的逻辑,比如通知用户或启动文件。

Toast.makeText(context, "Download complete! File saved in Downloads.", Toast.LENGTH_SHORT).show();
  • 此行代码会弹出一个 Toast 通知用户下载完成。

结尾

通过以上步骤,我们已经成功实现了 DownloadManager 的多任务下载。在实际开发中,您可以根据需要构建更复杂的下载管理逻辑,例如处理多个下载任务、暂停和恢复下载等。希望这篇文章能够对您有所帮助,祝您在 Android 开发的旅途中取得更多的成就!如果您有任何疑问或需要进一步的帮助,请随时与我联系。