android  自带了下载管理器,我们可以获取到下载的进度大小以及下载完成等等的状态,但是android自带的DownLoadManager却没有实现比如暂停,继续等功能也就是不能断点续传,这几天在总下载管理器,写了以后总是 感觉还是不是太好,因为下载要考虑的情况是比较多的

1、我们要考虑下载的时候要有下载情况的回调,

2、下载的文件是否已经下载

3、是否已经下载完成

4、下载速度

5、下载的进度

6、下载的过程中暂停,继续,取消等操作

7、可能有些人还要把下载的列表分为a 已经下载完成  b 正在下载

8、还有要加下载完成的通知,或是提示

9、还有listView经常遇到的进度条显示错乱

等等。。。。上网查找了很多的资料,网上有现成的第三方DownloadProvider这个,功能相当的齐全,但是我还是希望自己能写一个

下边是我自己的实现思路

首先 1 、要有一个service   来进行后台下载

2、需要有一个存放下载信息的一个实体类downLoadInfo  包含下载的文件大小,每次下载的大小,下载的速度等

private long id;

@Transient

private HttpHandler<File> handler;

private HttpHandler.State state
    private String downloadUrl;
    private String fileName;
    private String fileSavePath;
    private long progress;
    private long fileLength;
    private boolean autoResume;
    private boolean autoRename;
    private float speed;

3、一个下载管理器;进行下载的管理,已经下载进度的回调

下载我使用的是第三方的xutils

4 、一个DownLoadAdapter用来给listView填充数据

整体来讲就是这么多。

下载管理器代码如下

package cn.com.huahuawifi.android.guest.download;import android.content.Context;
import android.database.Cursor;
import android.util.Log;import cn.com.huahuawifi.android.guest.util.Utils;
import cn.com.huahuawifi.android.guest.util.XUtilsHttpUtil;import com.lidroid.xutils.DbUtils;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.db.converter.ColumnConverter;
import com.lidroid.xutils.db.converter.ColumnConverterFactory;
import com.lidroid.xutils.db.sqlite.ColumnDbType;
import com.lidroid.xutils.db.sqlite.Selector;
import com.lidroid.xutils.exception.DbException;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.HttpHandler;
import com.lidroid.xutils.http.HttpHandler.State;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.util.LogUtils;import java.io.File;
import java.util.ArrayList;
import java.util.List;/*** 下载管理器*/
public class DownloadManager {private List<DownloadInfo> downloadInfoList; // 下载列表private List<DownloadInfo> alreadyDownLoadList; // 已经下载完成的private List<DownloadInfo> downLoadingList; // 正在下载private int maxDownloadThread = 3; // 最大下载线程数private Context mContext;private DbUtils db;private long mLastTime;private long mLastFileSize;/* package */DownloadManager(Context appContext) {ColumnConverterFactory.registerColumnConverter(HttpHandler.State.class,new HttpHandlerStateConverter());mContext = appContext;db = DbUtils.create(mContext);alreadyDownLoadList = new ArrayList<DownloadInfo>();downLoadingList = new ArrayList<DownloadInfo>();try {downloadInfoList = db.findAll(Selector.from(DownloadInfo.class)); // 查询所有的下载} catch (DbException e) {LogUtils.e(e.getMessage(), e);}if (downloadInfoList == null) {downloadInfoList = new ArrayList<DownloadInfo>();} else {for (int i = 0; i < downloadInfoList.size(); i++) {if (downloadInfoList.get(i).getState().equals(com.lidroid.xutils.http.HttpHandler.State.SUCCESS)) {alreadyDownLoadList.add(downloadInfoList.get(i));} else {downLoadingList.add(downloadInfoList.get(i));}}}}public int getDownloadInfoListCount() {return downloadInfoList.size();}public DownloadInfo getDownloadInfo(int index) {return downloadInfoList.get(index);}public int getDownloadInfoLoadingCount() {return downLoadingList.size();}public List<DownloadInfo> getDownLoadingList() {return downLoadingList;}public DownloadInfo getDownLoadinginfo(int index) {downLoadingList.get(index);return downLoadingList.get(index);}public int getAlreadyDownLoadCount() {return alreadyDownLoadList.size();}public List<DownloadInfo> getAlreadyDownLoadList() {return alreadyDownLoadList;}public DownloadInfo getAlreadyDownLoadInfo(int index) {alreadyDownLoadList.get(index);return alreadyDownLoadList.get(index);}
/*** 获取当前url的文件是否在下载列表里,或去的时候想确保把改下载添加到了下载列表中* @param downloadUrl* @return*/public DownloadInfo  getDownLoadInfo(String  downloadUrl){DownloadInfo downloadInfo =null;for (DownloadInfo doInfo : downloadInfoList) {if (doInfo.getDownloadUrl().equals(downloadUrl)) {downloadInfo  =doInfo;return downloadInfo;}}return downloadInfo;}/*** 添加下载任务* * @param url*            下载链接* @param fileName*            文件名* @param target*            文件存放路径* @param autoResume* @param autoRename* @param callback*            回调* @throws DbException*/public void addNewDownload(String url, String fileName, String target,boolean autoResume, boolean autoRename,final RequestCallBack<File> callback) throws DbException {if (Utils.fileIsExists(target)) {// 下载文件已经存在不在添加下载任务} else {final DownloadInfo downloadInfo = new DownloadInfo();downloadInfo.setDownloadUrl(url);downloadInfo.setAutoRename(autoRename);downloadInfo.setAutoResume(autoResume);downloadInfo.setFileName(fileName);downloadInfo.setFileSavePath(target);HttpUtils http = new HttpUtils();http.configRequestThreadPoolSize(maxDownloadThread);HttpHandler<File> handler = http.download(url, target, autoResume,autoRename, new ManagerCallBack(downloadInfo, callback));downloadInfo.setHandler(handler);downloadInfo.setState(handler.getState());downloadInfoList.add(downloadInfo);db.saveBindingId(downloadInfo);}}public void resumeDownload(int index, final RequestCallBack<File> callback)throws DbException {final DownloadInfo downloadInfo = downloadInfoList.get(index);resumeDownload(downloadInfo, callback);}/*** 重新下载* * @param downloadInfo*            downLoadinfo信息* @param callback*            回调* @throws DbException*/public void resumeDownload(DownloadInfo downloadInfo,final RequestCallBack<File> callback) throws DbException {HttpUtils http = new HttpUtils();http.configRequestThreadPoolSize(maxDownloadThread);HttpHandler<File> handler = http.download(downloadInfo.getDownloadUrl(), downloadInfo.getFileSavePath(),downloadInfo.isAutoResume(), downloadInfo.isAutoRename(),new ManagerCallBack(downloadInfo, callback));downloadInfo.setHandler(handler);downloadInfo.setState(handler.getState());db.saveOrUpdate(downloadInfo);}/*** 移除下载任务* * @param index*            要移除的下表* @throws DbException*/public void removeDownload(int index) throws DbException {DownloadInfo downloadInfo = downloadInfoList.get(index);removeDownload(downloadInfo);}/*** 移除下载任务* * @param downloadInfo*            下载的downloadInfo对象* @throws DbException*/public void removeDownload(DownloadInfo downloadInfo) throws DbException {HttpHandler<File> handler = downloadInfo.getHandler();if (handler != null && !handler.isCancelled()) {handler.cancel();}downloadInfoList.remove(downloadInfo);downLoadingList.remove(downloadInfo);alreadyDownLoadList.remove(downloadInfo);db.delete(downloadInfo);}public void removeAlreadyDownLoad(DownloadInfo downloadInfo) throws DbException{HttpHandler<File> handler = downloadInfo.getHandler();if (handler != null && !handler.isCancelled()) {handler.cancel();}alreadyDownLoadList.remove(downloadInfo);Utils.deleteFile(downloadInfo.getFileSavePath());db.delete(downloadInfo);}/*** 停止下载* * @param index*            下载的下表* @throws DbException*/public void stopDownload(int index) throws DbException {DownloadInfo downloadInfo = downloadInfoList.get(index);stopDownload(downloadInfo);}/*** 停止下载* * @param downloadInfo*            下载的downloadInfo对象* @throws DbException*/public void stopDownload(DownloadInfo downloadInfo) throws DbException {HttpHandler<File> handler = downloadInfo.getHandler();if (handler != null && !handler.isCancelled()) {handler.cancel();} else {downloadInfo.setState(HttpHandler.State.CANCELLED);}db.saveOrUpdate(downloadInfo);}/*** 停止所有的下载任务* * @throws DbException*/public void stopAllDownload() throws DbException {for (DownloadInfo downloadInfo : downloadInfoList) {HttpHandler<File> handler = downloadInfo.getHandler();if (handler != null && !handler.isCancelled()) {handler.cancel();} else {downloadInfo.setState(HttpHandler.State.CANCELLED);}}db.saveOrUpdateAll(downloadInfoList);}/*** 改变数据库中下载状态* * @throws DbException*/public void backupDownloadInfoList() throws DbException {for (DownloadInfo downloadInfo : downloadInfoList) {HttpHandler<File> handler = downloadInfo.getHandler();if (handler != null) {switch (handler.getState()) {case WAITING:downloadInfo.setState(State.CANCELLED);break;case SUCCESS:break;case FAILURE:break;case LOADING:downloadInfo.setState(State.CANCELLED);break;case CANCELLED:downloadInfo.setState(State.CANCELLED);break;case STARTED:downloadInfo.setState(State.CANCELLED);break;default:break;}}}db.saveOrUpdateAll(downloadInfoList);}public int getMaxDownloadThread() {return maxDownloadThread;}/*** 设置最大下载线程* * @param maxDownloadThread*/public void setMaxDownloadThread(int maxDownloadThread) {this.maxDownloadThread = maxDownloadThread;}public class ManagerCallBack extends RequestCallBack<File> {private DownloadInfo downloadInfo;private RequestCallBack<File> baseCallBack;public RequestCallBack<File> getBaseCallBack() {return baseCallBack;}public void setBaseCallBack(RequestCallBack<File> baseCallBack) {this.baseCallBack = baseCallBack;}private ManagerCallBack(DownloadInfo downloadInfo,RequestCallBack<File> baseCallBack) {this.baseCallBack = baseCallBack;this.downloadInfo = downloadInfo;}@Overridepublic Object getUserTag() {if (baseCallBack == null)return null;return baseCallBack.getUserTag();}@Overridepublic void setUserTag(Object userTag) {if (baseCallBack == null)return;baseCallBack.setUserTag(userTag);}@Overridepublic void onStart() {HttpHandler<File> handler = downloadInfo.getHandler();if (handler != null) {downloadInfo.setState(handler.getState());}try {db.saveOrUpdate(downloadInfo);if (downLoadingList.size() == 0) {downLoadingList.add(downloadInfo);}} catch (DbException e) {LogUtils.e(e.getMessage(), e);}if (baseCallBack != null) {baseCallBack.onStart();}}@Overridepublic void onCancelled() {HttpHandler<File> handler = downloadInfo.getHandler();if (handler != null) {downloadInfo.setState(handler.getState());}try {db.saveOrUpdate(downloadInfo);} catch (DbException e) {LogUtils.e(e.getMessage(), e);}if (baseCallBack != null) {baseCallBack.onCancelled();}}@Overridepublic void onLoading(long total, long current, boolean isUploading) {HttpHandler<File> handler = downloadInfo.getHandler();if (handler != null) {downloadInfo.setState(handler.getState());}long nowTime = System.currentTimeMillis();Log.e("SPEED1", nowTime + "");Log.e("SPEED2", mLastTime + "");Log.e("SPEED1_file", current + "");Log.e("SPEED2_file", mLastFileSize + "");float speed = 0;float speedContent = current - mLastFileSize;float speedTimer = nowTime - mLastTime;if (mLastTime > 0 && current != 0) {if (speedContent >= 1024) {speedContent = (float) ((speedContent) / (1024 + 0.0));speedContent = (float) (((int) (speedContent * 10) % 10 + 0.0) / 10 + (int) speedContent);speedTimer = (float) ((speedTimer) / (1000 + 0.0));speed = speedContent / speedTimer;}Log.e("SPEED", speed + "");}mLastTime = nowTime;mLastFileSize = current;downloadInfo.setSpeed(speed);downloadInfo.setFileLength(total);downloadInfo.setFileAllSize(((float) total) / ((float) 1048576));;downloadInfo.setProgress(current);try {db.saveOrUpdate(downloadInfo);} catch (DbException e) {LogUtils.e(e.getMessage(), e);}if (baseCallBack != null) {baseCallBack.onLoading(total, current, isUploading);}}@Overridepublic void onSuccess(ResponseInfo<File> responseInfo) {HttpHandler<File> handler = downloadInfo.getHandler();if (handler != null) {downloadInfo.setState(handler.getState());downLoadingList.remove(downloadInfo);alreadyDownLoadList.add(downloadInfo);}try {db.saveOrUpdate(downloadInfo);} catch (DbException e) {LogUtils.e(e.getMessage(), e);}if (baseCallBack != null) {baseCallBack.onSuccess(responseInfo);}}@Overridepublic void onFailure(HttpException error, String msg) {HttpHandler<File> handler = downloadInfo.getHandler();if (handler != null) {downloadInfo.setState(handler.getState());}try {db.saveOrUpdate(downloadInfo);} catch (DbException e) {LogUtils.e(e.getMessage(), e);}if (baseCallBack != null) {baseCallBack.onFailure(error, msg);}}}private class HttpHandlerStateConverter implementsColumnConverter<HttpHandler.State> {@Overridepublic HttpHandler.State getFieldValue(Cursor cursor, int index) {return HttpHandler.State.valueOf(cursor.getInt(index));}@Overridepublic HttpHandler.State getFieldValue(String fieldStringValue) {if (fieldStringValue == null)return null;return HttpHandler.State.valueOf(fieldStringValue);}@Overridepublic Object fieldValue2ColumnValue(HttpHandler.State fieldValue) {return fieldValue.value();}@Overridepublic ColumnDbType getColumnDbType() {return ColumnDbType.INTEGER;}}
}

DownLoadInfo

<span style="font-size:10px;">package cn.com.huahuawifi.android.guest.download;import com.lidroid.xutils.db.annotation.Transient;
import com.lidroid.xutils.http.HttpHandler;import java.io.File;public class DownloadInfo {public DownloadInfo() {}private long id;@Transientprivate HttpHandler<File> handler;private HttpHandler.State state;private String downloadUrl;private String fileName;private String fileSavePath;private long progress;      //下载的长度private long fileLength;   //文件的总长度private boolean autoResume;private boolean autoRename;     private float speed;private float fileAllSize;public float getFileAllSize() {return fileAllSize;}public void setFileAllSize(float fileAllSize) {this.fileAllSize = fileAllSize;}public float getSpeed() {return speed;}public void setSpeed(float speed) {this.speed = speed;}public long getId() {return id;}public void setId(long id) {this.id = id;}public HttpHandler<File> getHandler() {return handler;}public void setHandler(HttpHandler<File> handler) {this.handler = handler;}public HttpHandler.State getState() {return state;}public void setState(HttpHandler.State state) {this.state = state;}public String getDownloadUrl() {return downloadUrl;}public void setDownloadUrl(String downloadUrl) {this.downloadUrl = downloadUrl;}public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}public String getFileSavePath() {return fileSavePath;}public void setFileSavePath(String fileSavePath) {this.fileSavePath = fileSavePath;}public long getProgress() {return progress;}public void setProgress(long progress) {this.progress = progress;}public long getFileLength() {return fileLength;}public void setFileLength(long fileLength) {this.fileLength = fileLength;}public boolean isAutoResume() {return autoResume;}public void setAutoResume(boolean autoResume) {this.autoResume = autoResume;}public boolean isAutoRename() {return autoRename;}public void setAutoRename(boolean autoRename) {this.autoRename = autoRename;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof DownloadInfo)) return false;DownloadInfo that = (DownloadInfo) o;if (id != that.id) return false;return true;}@Overridepublic int hashCode() {return (int) (id ^ (id >>> 32));}
}</span><span style="font-size:18px;font-weight: bold;">
</span>

下载的service

<span style="font-size:10px;">package cn.com.huahuawifi.android.guest.download;import android.app.ActivityManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import com.lidroid.xutils.exception.DbException;
import com.lidroid.xutils.util.LogUtils;import java.util.List;public class DownloadService extends Service {private static DownloadManager DOWNLOAD_MANAGER;public static DownloadManager getDownloadManager(Context appContext) {if (!DownloadService.isServiceRunning(appContext)) {Intent downloadSvr = new Intent("download.service.action");appContext.startService(downloadSvr);}if (DownloadService.DOWNLOAD_MANAGER == null) {DownloadService.DOWNLOAD_MANAGER = new DownloadManager(appContext);}return DOWNLOAD_MANAGER;}public DownloadService() {super();}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();}@Overridepublic void onStart(Intent intent, int startId) {super.onStart(intent, startId);}@Overridepublic void onDestroy() {if (DOWNLOAD_MANAGER != null) {try {DOWNLOAD_MANAGER.stopAllDownload();DOWNLOAD_MANAGER.backupDownloadInfoList();} catch (DbException e) {LogUtils.e(e.getMessage(), e);}}super.onDestroy();}public static boolean isServiceRunning(Context context) {boolean isRunning = false;ActivityManager activityManager =(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);List<ActivityManager.RunningServiceInfo> serviceList= activityManager.getRunningServices(Integer.MAX_VALUE);if (serviceList == null || serviceList.size() == 0) {return false;}for (int i = 0; i < serviceList.size(); i++) {if (serviceList.get(i).service.getClassName().equals(DownloadService.class.getName())) {isRunning = true;break;}}return isRunning;}
}</span><span style="font-size:18px;font-weight: bold;">
</span>

android 下载管理器相关推荐

  1. android文件下载含服务器端,制作http/https文件共享服务器的Android下载管理器

    我正在使用下载管理器的Android方下载来自不同来源的文件.现在我应该为这个应用程序创建一个服务器端.制作http/https文件共享服务器的Android下载管理器 的一切都在这里首先是为Andr ...

  2. 史上功能完整强大的android下载管理器

    废话不说,有图为证: 功能完整强大的android下载管理器, 支持多任务管理,断点续传,暂停下载, 下载任务图标设置,状态栏通知(进度条),媲美国内知名软件市场hiapk,360手机助手等内置的下载 ...

  3. android下载管理功能,Android下载管理器

    DownloadManager Android下载管理器 1.可实现下载.暂停.取消.完成.失败.队列等待等状态的监听 2.可断点续传 3.基于okhttp的下载管理器,可实现单个页面的进度回调,也可 ...

  4. android下载管理器怎么用,如何启用Android下载管理器

    如果无效,请编辑我的答案 检查下载管理器是否可用: int state = this.getPackageManager().getApplicationEnabledSetting("co ...

  5. android 下载管理器简介

    DownloadManager是android提供的一个系统服务,用于处理长期运行的HTTP下载.客户端可以将一个URI代表的一个网络资源文件下载到指定的目录.DownloadManager将会在后台 ...

  6. android下载https文件,Android下载管理器未从https下载文件(示例代码)

    在我的Android应用中,我从Amazon服务CloudFront下载媒体文件. 这是我的代码:DownloadManager downloadManager = (DownloadManager) ...

  7. Android 应用更新和在服务器下载android应用

    下载android应用有两种表现形式:一种是交给Android系统的下载管理器;另一种是自己去监控下载. 1.使用Android下载管理器下载应用并安装 public class UpdateServ ...

  8. Android知识点总结

    Android知识总结:(内容有很多还在补全中) Activity: 用来跟用户来进行交互的界面,使用过程中要注意的就是他的生命周期, onCreate的时候只是加载布局文件,进行控件的初始化,这个时 ...

  9. Android解析XML文件

    XML文件和获取XML值 XML文件样例 <?xml version="1.0" encoding="utf-8"?> <citys> ...

最新文章

  1. YYCache 源码学习(一):YYMemoryCache
  2. Oracle后台进程
  3. 微信开发:微信js_sdk 分享,前端部分(二)
  4. AGC004(A~E)
  5. STM32使用PWM输入模式测试频率和占空比
  6. ubuntu20.04 搭建tftp服务器
  7. ie 谷歌插件Chrome Frame
  8. MMKV_MMKV简介
  9. php解析shapefile,Fiona简介及Shapefile数据读取
  10. web新手之使用easyAR实现WebAR
  11. java 数独算法_Java:递归数独解法计数算法
  12. 【小程序】一文带你了解微信小程序开发(小程序注册/开发工具的下载)
  13. 让子弹再飞一会:游戏中关于碰撞体积的趣闻
  14. 小特工具箱5.0发布 增加50+个功能
  15. 红外线发射与接收源程序
  16. form表单提交,action需要加项目名
  17. Python virtualenv工具设置虚拟环境和VS code调试Python
  18. xplorer spill address
  19. java获取Pdf文件页码
  20. 详述虚拟网站的权限突破及防范1(转)

热门文章

  1. Broadcast 使用详解
  2. B. Lorry (贪心)
  3. sql时间函数以及格式转换
  4. 有后效性和无后效性的通俗理解
  5. 计算机点火工作原理,简述汽车发动机ECU工作原理
  6. 郑莉java课后答案,Java语言程序设计(郑莉)第三章课后习题答案
  7. 文献阅读:利用斯托克斯参量验证光波偏振态(补充)
  8. linux操作系统下载gLINUX数据恢复及RAID数据恢复解决方案(组图
  9. php 银联支付(快捷支付)
  10. MB10F-ASEMI整流桥MB10F