您的位置:首页 > 其它

使用DownloadProvider来完成下载任务

2013-04-12 18:41 1056 查看
在同事在做一个自动更新的任务,也做得差不多,这里面有一个很重要的组成部分就是从网站上下载更新包的问题。这对于很多开发者来说,都不是什么大的问题,网上也可以搜索出很多的源码出来进行下载,也就是用httpClient,方法很多,我这里就不说了,这里我要说的是利用2.3本身已经打开的 DownloadProvider这个API来进行下载,可以省掉我们写的很多代码,而且更加地专业,最重要的是,这个DownloadProvider是可以实现断点续传功能的,在一些主要的应用里面也可以看到它的身影,如browser(浏览器)、market(市场)里面,都是调用了这个API,只是在2.3之前,并没有公布这个API接口,所以要使用起来会比较麻烦,当然如果是内部开发者的话,就完全没有问题,只是要在DownloadProvider的XML文件里面改一些权限就可以了,这里我就不细说了,我只说2.3的。
其实,这个API的公布,网上也有很多的文章,但我发现,那些文章都是一样,并没有告诉你,怎么去用这个API,所以,我想着自己来写一个文章告诉大家怎样来用这个API。

下面,我将详细讲解这个API:

先要初始化一个DownloadManager对象

DownloadManager manger=getSystemService(Context.DOWNLOAD_SERVICE) ;

然后,定义DownloadManager.Request,这个对象,很简单



DownloadManager.Request down=new DownloadManager.Request (Url.parse(http://122.com/222.apk));

里面是一个URL,为了简单,我就这样子写,大家都明白的

DownloadManager.Request setShowRunningNotification(boolean show) //是否显示下载进度的提示

DownloadManager.Request setTitle(CharSequence title) //设置notification的标题

DownloadManager.Request setVisibleInDownloadsUi(boolean isVisible) //设置下载管理类在处理过程中的界面是否显示

DownloadManager.Request setAllowedNetworkTypes(int flags) //设置允许使用的网络类型,这一步Android 2.3做的很好,目前有两种定义分别为NETWORK_MOBILE和NETWORK_WIFI我们可以选择使用移动网络或Wifi方式来下载。

DownloadManager.Request setAllowedOverRoaming(boolean allowed) //对于下载,考虑到流量费用,这里是否允许使用漫游。

DownloadManager.Request setDescription(CharSequence description) //设置一个描述信息,主要是最终显示的notification提示,可以随便写个自己区别

DownloadManager.Request setDestinationInExternalFilesDir(Context context, String dirType, String subPath) //设置目标存储在外部目录,一般位置可以用 getExternalFilesDir()方法获取。

setDestinationInExternalFilesDir这个方法,必须要重点讲,如果这个方法用得不好,很有可能就出现问题,

dirType 这个参数是外部储存器下的一个目录,也就是SD卡下面的一个目录来的,如DCIM之类的,名字可以自己取,但必须是SD卡下的一个目录。

subpath这个参数是上面Url里面的,最后下载的文件的名字,如上面所述,这个参数应该为222.apk.

现在,实例化好了down,再加上一些自己想要的设置,记住setDestinationInExternalFilesDir这个方法,是必须要实现的,其他的自己选择,





做到这一步,我们就可以来开始实现下载功能了。

manger.enqueue(down);即开始下载

很简单吧!!!



可能大家会有疑问,不是说有断点续传的功能吗? 为什么我按照你的要求来做了,第二次开机没有续传呀,你是骗我们吗?

说实话,我不是,我真的没骗大家,这个断点续传的功能,并不是由系统自己来完成,还需要我们自己去完成这个续传的功能,这样

由Downloadprovider才会知道我们要续传什么,然后才能够去实现这个续传的功能。

还没写完呢,继续看哈



要实现续传的功能,应该怎样去实现呢!很简单,只要在自己的应用里面,也写上一个数据库,然后在下载的过程中,通过一个间隔X秒的时间的服务去监听这个下载数据库里面的数据,然后比较里面的总数据和当前总据,看是否相等,如果相等,则说明已经下载完成了,这种情况,我们就不做说明了,我们具体要说的是没有下载完的情况。

如果是没下载完,不相等,我们就必须要把这个数据库的内容,如DownProvider里面的数据ID,总大小,当前大小给记录到我们自己的数据库里面,以方便我们来进行续传的管理。

举个例子,我们在下载一个东西的时候,突然之间,网断了,然后我们自己的服务就把当前的DownProvider里面的数据库里面的东西写到我们自己的数据库里面去了,然后在下次开机的时候,我们也会首先打开这个服务,作用是查询自己的数据库里面,是否有未完成的下载,也就是当总大小不等于当前大小的时候,

这个时候,我们要做的事,就是把这个未完成的下载的数据的游标获取到,然后再从中得到我们想要知道的上一次关机前记录在数据库里面的DownProvder的未完成下载数据记录的ID号,然后,我们就可以利用这个ID号,把这个ID号传回到我们在上面定义 的manger里面,即可完成续传的任务。

现在比较忙,过两天,我会把具体怎么做发出来。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐