使用DownloadManager进行应用下载

最近在做公司的应用下载功能,使用到的是系统提供的DownloadManager,正好抽时间做成一个模块。

关于DownloadManager

先来看一段官方的介绍:

The download manager is a system service that handles long-running HTTP downloads. Clients may
request that a URI be downloaded to a particular destination file. The download manager will conduct the download in the background, taking care of HTTP interactions and retrying downloads after failures or across connectivity changes and system reboots.

大致意思是讲:DownloadManager是处理长时间运行的http下载的系统服务,客户端请求URI下载到特定的文件,downloadManager将会在后台进行下载,负责http交互以及在失败、连接更改或系统重启之后重新下载。

提供的接口

  • public long enqueue(Request request) 执行下载任务并返回下载Id,后续可通过Id查询下载的各种信息
  • public Cursor query(Query query) 查询下载信息,包括下载路径以及下载的状态
  • public int remove(long… ids) 取消下载任务

示例

  • 首先我们需要构建一个下载任务,通过设置属性来定制下载路径、通知栏显示、标题等信息
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
        request.setMimeType("application/vnd.android.package-archive");
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, appName);
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
        request.setTitle(title);
        request.setDescription(desc);
  • 有了任务之后我们就可以执行这个下载任务,执行之后并同步返回一个downloadId,便于我们之后来查询下载的状态
long downloadId=downloadManager.enqueue(request);
  • 我们可以通过downloadId去查询下载的状态信息
//获取下载路径
DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
        Cursor cursor = downloadManager.query(query);
        if (cursor != null) {
            try {
                if (cursor.moveToFirst()) {
                    return cursor.getString(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_LOCAL_URI));
                }
            } catch (Exception e) {
                Log.e(TAG, e.getMessage());
            } finally {
                cursor.close();
            }
        }
//获取下载的状态
DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
        Cursor cursor = downloadManager.query(query);
        if (cursor != null) {
            try {
                if (cursor.moveToFirst()) {
                    return cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));
                }
            } catch (Exception e) {
                Log.e(TAG, e.getMessage());
            } finally {
                cursor.close();
            }
        }
        return -1;
  • DownloadManager下载完之后会发送一个系统广播,我们需要再定义一个广播接收器去接受这个广播完成安装。
//广播部分代码
@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,-1L);
            install(context,downloadId);
        }
    }

到这就是DownloadManager的基本使用过程,代码细节没有贴出,对代码细节感兴趣的看Demo吧,Demo已经把下载服务封装成一个单独的模块,支持DownloadManager下载,Http下载(支持进度回调、自带默认UI(可选))

源码下载:https://github.com/pengjiangbin/UpdateModule

猜你喜欢

转载自blog.csdn.net/ww55555577/article/details/80021740