使用DownloadProvider来完成下载任务

   在同事在做一个自动更新的任务,也做得差不多,这里面有一个很重要的组成部分就是从网站上下载更新包的问题。这对于很多开发者来说,都不是什么大的问题,网上也可以搜索出很多的源码出来进行下载,也就是用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里面,即可完成续传的任务。

  现在比较忙,过两天,我会把具体怎么做发出来。。。

 

 

你可能感兴趣的:(使用DownloadProvider来完成下载任务)