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));
看了一下源码才知道,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传进去就好了,
是不是很像数据库的操作。