Android DownloadManager 的使用
2014-12-11 本文已影响8034人
SoloHo
Android自家使用了Volley来处理轻量级的网络请求,但是不建议用来处理下载大文件,在寻求如何下载大数据的时候,Android官方给出了一个建议,使用DownloadManager来处理。
Volley is not suitable for large download or streaming operations, since Volley holds all responses in memory during parsing. For large download operations, consider using an alternative like DownloadManager.
使用DownloadManager来下载
我不想详细列出它有哪些方法,哪些参数可供开发人员使用,因为我希望你把注意力放在DownloadManager是如何开始下载的。首先假设我们需要下载一个apk来更新应用的版本,那么来看一下如何使用DownloadManager来处理的:
// uri 是你的下载地址,可以使用Uri.parse("http://")包装成Uri对象
DownloadManager.Request req = new DownloadManager.Request(uri);
// 通过setAllowedNetworkTypes方法可以设置允许在何种网络下下载,
// 也可以使用setAllowedOverRoaming方法,它更加灵活
req.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
// 此方法表示在下载过程中通知栏会一直显示该下载,在下载完成后仍然会显示,
// 直到用户点击该通知或者消除该通知。还有其他参数可供选择
req.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
// 设置下载文件存放的路径,同样你可以选择以下方法存放在你想要的位置。
// setDestinationUri
// setDestinationInExternalPublicDir
req.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, title);
// 设置一些基本显示信息
req.setTitle("Android.apk");
req.setDescription("下载完后请点击打开");
req.setMimeType("application/vnd.android.package-archive");
// Ok go!
DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
long downloadId = dm.enqueue(req);
这样我们就开始下载了。至于断点续传、在什么网络环境下下载,系统已经按我们想要的方式来运行,我们并不需要担心这些。
获取下载文件
看到上面代码的最后一行返回的参数downloadId了吗?对,我们需要利用它来找出我们刚刚下载的文件:
DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
Cursor c = dm.query(query);
if (c != null) {
if (c.moveToFirst()) {
String fileUri = c.getString(c.getColumnIndexOrThrow(DownloadManager.COLUMN_LOCAL_URI));
// TODO 你可以在这里处理你的文件
}
c.close();
}
获取下载的状态
有时候我们不想重复下载同一个文件,或者出于某种原因,我们需要查询下载的状态,以便于更新界面等操作,那么我们来看看如何获取下载的状态的:
DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
Cursor c = dm.query(query);
if (c != null && c.moveToFirst()) {
int status = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));
switch (status) {
case DownloadManager.STATUS_PENDING:
break;
case DownloadManager.STATUS_PAUSED:
break;
case DownloadManager.STATUS_RUNNING:
break;
case DownloadManager.STATUS_SUCCESSFUL:
break;
case DownloadManager.STATUS_FAILED:
break;
}
if (c != null) {
c.close();
}
每个方法都如其名,不在赘述。
最后
断点续传?交给系统处理吧。