android基础--DownloadManager

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);
			}
		}
	};







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值