在同事在做一个自动更新的任务,也做得差不多,这里面有一个很重要的组成部分就是从网站上下载更新包的问题。这对于很多开发者来说,都不是什么大的问题, 网上也可以搜索出很多的源码出来进行下载,也就是用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里面,即可完成续传的任务。
现在比较忙,过两天,我会把具体怎么做发出来。。。
转:http://blog.csdn.net/poolwater/article/details/6916572