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传进去就好了,
是不是很像数据库的操作。