这几天由于公司项目需要,学习了DownloadManager下载管理器。由于公司自己写的下载类下载速度太慢,尽管使用了多线程下载,但是下载速度不尽人意。后来自己写了一个demo,使用了android自带的下载管理器DownloadManager.使用DownloadManager很简单的几行代码就搞定了。如下代码所示:
String serviceString = Context.DOWNLOAD_SERVICE;
DownloadManager downloadManager;
downloadManager = (DownloadManager)getSystemService(serviceString);
Uri uri = Uri.parse("http://au.apk.umeng.com/uploads/apps/56f52012e0f55ad7c9001efc/_umeng_%40_20_%40_b721620b58c141c9dddd8c50c4a21c52.apk");
DownloadManager.Request request = new Request(uri);
File saveFile = new File(Environment.getExternalStorageDirectory()+"/download.apk");
request.setDestinationUri(Uri.fromFile(saveFile));
request.setAllowedNetworkTypes(Request.NETWORK_WIFI);
request.setTitle("下载demo");
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
mReference = downloadManager.enqueue(request);
如果需要侦听下载进度,或者获取其他下载信息,可根据以下代码来实现:
int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); //根据downloadManager.enqueue(request)返回的下载ID,从数据库查询下载状态。
int reasonIdx = c.getColumnIndex(DownloadManager.COLUMN_REASON);
int titleIdx = c.getColumnIndex(DownloadManager.COLUMN_TITLE); //查询下载标题 就是你setTitle的字符串
int fileSizeIdx = c.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES); / / 文件的总长度
int bytesDLIdx = c.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR); //以下载的长度
String title = c.getString(titleIdx);
int fileSize = c.getInt(fileSizeIdx);
int bytesDL = c.getInt(bytesDLIdx);
下载进度就是bytesDL / fileSize 。
可以根据自己的需要,设置是否需要在通知栏显示下载进度,也可以注册广播,侦听下载进度,和下载是否完成。
DownlaodManager的下载速度还是很快的,自此下载demo完成
这几天一直在测试下载的性能,在测试过程中发现一个问题。那就是DownloadManager 下载文件路径不能是app的私有目录。会报错。所以下载路径只能是Sd卡目录
另外一个,DownloadManager是在2.3系统之后才支持,低于2.3的会运行报错