Android获取下载进度的实现

概述

在Android开发中,获取下载进度是一个常见的需求。本文将介绍如何实现Android获取下载进度的方法,帮助刚入行的开发者快速掌握这个技巧。

任务流程

首先,让我们了解整个任务的流程,下面的表格展示了大致的步骤:

步骤 描述
步骤1 创建一个下载任务
步骤2 监听下载进度
步骤3 更新UI界面显示下载进度

接下来,我们将逐步介绍每个步骤需要做的事情,包括需要使用的代码和相关注释。

步骤1:创建一个下载任务

首先,我们需要创建一个下载任务。可以使用DownloadManager类来执行下载任务,以下是创建下载任务的代码片段:

// 引用形式的描述信息:创建下载任务
DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadUrl));
// 设置下载文件的保存路径和文件名
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
// 将下载任务加入下载队列
long downloadId = downloadManager.enqueue(request);

解释一下上述代码的含义:

  • DownloadManager是一个系统服务类,通过getSystemService()方法获取其实例。
  • DownloadManager.Request用于创建一个下载请求对象,需要传入下载文件的URL。
  • setDestinationInExternalPublicDir()方法用于设置下载文件的保存路径和文件名。
  • enqueue()方法将下载任务加入下载队列,并返回一个唯一的下载ID供后续使用。

步骤2:监听下载进度

接下来,我们需要监听下载的进度。可以使用BroadcastReceiver来接收下载完成的广播,并在广播接收者中获取下载进度,以下是实现监听下载进度的代码片段:

// 引用形式的描述信息:监听下载进度
BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
            // 下载完成
            long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
            // 根据下载ID查询下载任务
            DownloadManager.Query query = new DownloadManager.Query();
            query.setFilterById(downloadId);
            Cursor cursor = downloadManager.query(query);
            if (cursor.moveToFirst()) {
                int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
                if (status == DownloadManager.STATUS_SUCCESSFUL) {
                    // 下载成功
                    String filePath = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                    // TODO: 处理下载成功逻辑
                } else if (status == DownloadManager.STATUS_FAILED) {
                    // 下载失败
                    // TODO: 处理下载失败逻辑
                }
            }
            cursor.close();
        } else if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) {
            // 通知栏点击
            // TODO: 处理通知栏点击逻辑
        }
    }
};
registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED));

上述代码中:

  • BroadcastReceiver用于接收下载完成和通知栏点击的广播,并在onReceive()方法中处理相应的逻辑。
  • 利用DownloadManager.EXTRA_DOWNLOAD_ID获取下载ID。
  • 使用DownloadManager.Query查询下载任务的状态。
  • 通过DownloadManager.COLUMN_STATUS获取下载任务的状态值,DownloadManager.STATUS_SUCCESSFUL表示下载成功,DownloadManager.STATUS_FAILED表示下载失败。
  • 如果下载成功,可以通过DownloadManager.COLUMN_LOCAL_URI获取下载文件的本地路径。

步骤3:更新UI界面显示下载进度

最后,我们需要更新UI界面来显示下载进度。可以使用ProgressBar来展示下载进度,以下是更新UI界面显示下载进度的代码片段:

// 引用形式的描述信息:更新UI界面显示下载进度
ProgressBar progressBar = findViewById(R.id.progressBar);
BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
            // 下载完成
            long downloadId = intent.getLongExtra