Android原生下载组件DownloadManager

水麒
2023-12-01

##简述
DownloadManger是android 2.3(API 9)开始提供的系统服务,用于处理长时间的下载操作。应用场景是客户端请求一个URL地址去下载一个目标文件。DownloadManger可以构建一个后台下载服务,在发生故障或连接更改、重新启动系统等情况后,处理HTTP连接并重试下载。
主要的接口和类:

1、内部类DownloadManager.Query,这个类可以用于过滤DownloadManager的请求。

2、内部类DownloadManager.Request,这个类包含请求一个新下载连接的必要信息。

3、公共方法enqueue,在队列中插入一个新的下载。当连接正常
,并且DownloadManager准备执行这个请求时,开始自动下载。返回结果是系统提供的唯一下载ID,这个ID可以用于与这个下载相关的回调。

4、公共方法query,用于查询下载信息。

5、公共方法remove,用于删除下载,如果下载中则取消下载。同时会删除下载文件和记录。
##DownloadManager使用

        String downLoadUrl = "";
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downLoadHtmlUrl));
        //设置漫游条件下是否可以下载
        request.setAllowedOverRoaming(false);
        //在通知栏中显示,默认就是显示的
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
        //设置通知标题
        request.setTitle("通知标题,随意修改");
        //设置通知标题message
        request.setDescription("新版zip下载中...");
        request.setVisibleInDownloadsUi(true);
        //设置文件存放路径
        File file = new File(Environment.getExternalStorageDirectory(), "appCode.zip");
        request.setDestinationUri(Uri.fromFile(file));
//                pathstr = file.getAbsolutePath();
        if (downloadManager == null)
            downloadManager =(DownloadManager) MainActivity.this.getSystemService(Context.DOWNLOAD_SERVICE);
        //将下载请求加入下载队列,加入下载队列后会给该任务返回一个long型的id,通过该id可以取消任务,重启任务、获取下载的文件等等
        if (downloadManager != null) {
            downloadId = downloadManager.enqueue(request);
        }

##监听下载状态和进度
1.通过广播监听下载状态

//广播监听下载的各个状态
    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            checkStatus();
        }
    };
//检查下载状态
    private void checkStatus() {
        DownloadManager.Query query = new DownloadManager.Query();
        //通过下载的id查找
        query.setFilterById(downloadId);
        Cursor cursor = downloadManager.query(query);
        if (cursor.moveToFirst()) {
            int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
            switch (status) {
                //下载暂停
                case DownloadManager.STATUS_PAUSED:
                    break;
                //下载延迟
                case DownloadManager.STATUS_PENDING:
                    break;
                //正在下载
                case DownloadManager.STATUS_RUNNING:
                    break;
                //下载完成
                case DownloadManager.STATUS_SUCCESSFUL:
                    //下载完成
                    cursor.close();
                    break;
                //下载失败
                case DownloadManager.STATUS_FAILED:
                    cursor.close();
                    break;
            }
        }
    }

2.注册广播

//注册广播监测下载情况
        MainActivity.this.registerReceiver(receiver,
                new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
 类似资料: