DownloadManager使用

android要求所有的耗时操作都不可以在主线程中处理,所以像这样的操作都需要放在子线程中,今天我们不说java的线程操作,说一下android自带的下载管理器的使用。

官方网址 : http://developer.android.com/reference/android/app/DownloadManager.html

下面说一下我在项目使用中的心得:

1、获取DownloadManager对象   :

DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);

2、下载的话肯定是要和服务器建立HTTP连接,要发请求的,DownloadManager中发请求通过DownloadManager.Request对象

官方网址   : http://developer.android.com/reference/android/app/DownloadManager.Request.html

这个类的API不多蛮好理解的,下面看一下我的代码

                       String url = "http://xx.xxx.com/xxx/xxx_android.apk";

			Request request = new Request(Uri.parse(url));

			//设置可用的网络类型
			request.setAllowedNetworkTypes(Request.NETWORK_MOBILE
					| Request.NETWORK_WIFI);

			//设置是否允许漫游网络 建立请求 默认true
			request.setAllowedOverRoaming(true);

			//设置状态栏中显示Notification
			request.setNotificationVisibility(Request.VISIBILITY_VISIBLE);

			//设置Notification的标题
			request.setTitle("my downloadmanager");

			//设置Notification的描述
			request.setDescription("this is description !!!");

			//设置下载的目录
			request.setDestinationInExternalPublicDir("A",
					"abc.apk");

			MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();

			//设置请求的Mime
			request.setMimeType(mimeTypeMap.getMimeTypeFromExtension(url));

3、下载管理器中有很多下载项,怎么知道一个资源已经下载过,避免重复下载呢?我的项目中的需求就是apk更新下载,用户点击更新确定按钮,第一次是直接下载,后面如果用户连续点击更新确定按钮,就不要重复下载了。这时候怎么做呢??看了一下DownloadManager的API好像没有一个可以用的,只有一个query(Query query)方法,

看了一下源码才知道,DownloadManager的查询操作全部使用Query操作,Query是DownloadManager的静态内部类。

DownloadManager里面使用的是ContentProvider下载的记录全部保存在数据库中,通过ContentProvider暴露接口。

那我们怎么判断一个记录是不是已经下载过了呢?

DownloadManager的enqueue(Request  request) 方法是将下载请求加入到下载管理器中,这个方法返回一个long类型的ID这是唯一标识,

我们可以利用这个id进行判断,比如:

                Query query = new Query();

		query.setFilterById(id);

		Cursor cursor = dm.query(query);

		if (!cursor.moveToFirst()) {// 没有记录
                }else//有记录


这边可以看出来查询和操作数据库查询一样的。

4、下载管理器中的记录下载有没有下载完成怎么判断呢??

DownloadManager在一条记录下载完成后会发一个广播DownloadManager.ACTION_DOWNLOAD_COMPLETE  我们只需要接受就行了

比如可以在当前的类中写一个内部类 继承自 广播接收者 

private BroadcastReceiver receiver = new BroadcastReceiver() {

		@SuppressLint("NewApi")
		@Override
		public void onReceive(Context context, Intent intent) {
			if (intent.getAction().equals(
					DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
				Toast.makeText(MainActivity.this, "download finished ",
						Toast.LENGTH_SHORT).show();
			}
		}
	};

就这么简单


5、如果你想删掉一条下载记录怎么操作呢??

DownloadManager提供了remove(long... ids)方法,我们只要把记录的id传进去就好了,

是不是很像数据库的操作。



你可能感兴趣的:(DownloadManager使用)