DownloadManager作为一项服务用来处理Http连接, 监视连接的状态, 以及提供断点续传等功能. 总而言之, DownloadManager使我们的下载操作更方便了.
下面给出一小段使用DownloadManager的代码:
String serviceString = Context.DOWNLOAD_SERVICE;
DownloadManager downloadManager;
downloadManager = (DownloadManager)getSystemService(serviceString);
Uri uri = Uri.parse(“http://ishare.iask.sina.com.cn/f/16732631.html”);
DownloadManager.Request request = new Request(uri);
long reference = downloadManager.enqueue(request);
要使用DownloadManager首先需要使用getSystemService获得DOWNLOAD_SERVICE服务.
DownloadManager.Request是DownloadManager的内置类, 包含了下载文件所需要的所有信息.
enqueue作用就是把request放入下载队列, 就是正式开始下载文件咯.
我们还可以使用DownloadManager的setAllowedNetworkTypes和setAllowedOverRoaming等方法来限制我们的下载环境.
如request.setAllowedNetworkTypes(Request.NETWORK_WIFI); 限制在有WIFI的时候才下载, 可以节省我们那少得可怜的流量.
如果需要在完成下载之后执行某些动作, 可以参考以下小段代码:
IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//EXTRA_DOWNLOAD_ID指向已下载文件的ID
long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if (myDownloadReference == reference) {
// Do something with downloaded file.
}
}
};
registerReceiver(receiver, filter);
当下载完成时, 会发出一个action为DownloadManager.ACTION_DOWNLOAD_COMPLETE的广播. 我们要获得这个信息, 当然就要注册一个BroadcastReceiver咯.
开始下载文件之后, Notificatoin会显示下载进度, 如下所示.
如果你想在用户点击这个Item的时候执行某些操作, 可以参考以下代码:
IntentFilter filter = new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED);
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String extraID = DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS;
//保存用户选择的多个Download的ID
long[] references = intent.getLongArrayExtra(extraID);
for (long reference : references)
if (reference == myDownloadReference) {
// Do something with downloading file.
}
}
};
registerReceiver(receiver, filter
这里和上面一样, 也是使用BroadcastReceiver接收广播.
DownloadManager.Request中有一些定制Download Manager Notifications的函数
如上述代码中使用request.setTitle(“Earthquakes”)和request.setDescription(“Earthquake XML”)可以获得如下效果
其他的函数就不介绍了, 有兴趣的可以直接查看DownloadManager.Request的api文档
DownloadManager.Request还可以更改文件下载路径, 系统默认路径是/data/data/com.android.providers/downloads/cache
把文件下载到外置sdcard需要有WRITE_EXTERNAL_STORAGE的权限.
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>
下面的代码片段是在外部存储中指定一个任意的保存位置的方法:
request.setDestinationUri(Uri.fromFile(f));
下面这个方法设置程序专用的文件存放目录, 注意这个文件夹不提供访问控制,所以其他的应用也可以访问这个文件夹。在这种情况下,如果你的应用卸载了,那么在这个文件夹也会被删除:
request.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, “android.jpg”);
如果下载的文件希望被其他的应用共享,特别是那些希望被Media Scanner扫描到的文件(比如音乐文件),那么可以指定下载路径在外部存储的公共文件夹之下:
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MUSIC, “Android_Rock.mp3”);
下面一个BroadcastReceiver监听DowloadManager.ACTION_DOWNLOAD_COMPLETE, 查询下载的文件在哪里:
BroadcastReceiver receiver = new BroadcastReceiver()
{
public void onReceive(Context context, Intent intent)
{
long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
Query query = new Query();
query.setFilterById(id);
Cursor cur = manager.query(query);
if(cur.moveToFirst())
{
int columnIndex = cur.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI);
String uri = cur.getString(columnIndex);
System.out.println(uri);
}
}
};