前一阵子,在给公司的智能电视作下载模块的时候发现,android自带的DownloadManager在有线网的状况下没有反应。看了下源码发现标准的手机版android的DownloaderManager就是没有对有线网的状况做处理,因而花了些时间本身写了个下载模块。考虑到国内大多数的智能电视都是基于手机版android改的,因此这里共享一下。 java
先发一下源码地址:https://github.com/zhanglong1/ZlsamDownloadService。 android
ZlsamDownloadService是一个能够管理多个下载任务的android服务,你把它做为DownloadManager的备选方案。具体功能以下: git
-
支持多任务github
-
线程安全安全
-
支持有线网环境app
-
能够多app共享使用ide
-
持久化状态,下次启动时能够继续未完成任务测试
- 支持插队,对于紧急任务特别有用
最大等待队列:20;ui
最大处理队列:3;url
最大成功队列:20;
最大失败队列:20。
若是以上参数不能知足你的需求,你能够直接在代码中更改,具体位置在TaskQueueManager。
如何使用
若是你想将代码嵌入到你本身的项目当中,你须要将ZlsamDownloadService项目改成library,并在你的项目中引用。在onStart回调中启动和绑定的代码以下:
Intent intent = new Intent("com.zlsam.download.DOWNLOAD_SERVICE"); startService(intent); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); IMainDownloadingService mDownloadService; private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mDownloadService = IMainDownloadingService.Stub.asInterface(service); appendLog("Bound to download service."); } @Override public void onServiceDisconnected(ComponentName name) { mDownloadService = null; } };
绑定成功以后你能够调用相关方法,这些方法定义在com.zlsam.download.IMainDownloadingService。
下载:
try { int result = mDownloadService.add2Queue(url, null, null, false); if (result < 0) { appendLog("Add task failed, error code: " + result + ", url: " + url); } else { appendLog("Add task succeed, url: " + url); } } catch (RemoteException e) { e.printStackTrace(); }
插队下载:
try { int result = mDownloadService.add2Queue(url, null, null, true); if (result < 0) { appendLog("Add task jump failed, error code: " + result + ", url: " + url); } else { appendLog("Add task jump succeed, url: " + url); } } catch (RemoteException e) { e.printStackTrace(); }
检查任务状态:
try { state = mDownloadService.queryState(url); } catch (RemoteException e) { e.printStackTrace(); appendLog("Check task state: exception, url: " + url); } switch (state) { case -1: appendLog("Check task state: not found, url: " + url); break; case 0: appendLog("Check task state: waiting, url: " + url); break; case 1: appendLog("Check task state: processing, url: " + url); break; case 2: appendLog("Check task state: succeed, url: " + url); break; case 3: appendLog("Check task state: failed, url: " + url); break; }
若是你想清除一个已经结束的(成功或者失败)任务(包括已下载的文件):
try { mDownloadService.clearOne(mFinishedTasks.get(mFinishedTasks.size() - 1)); } catch (RemoteException e) { e.printStackTrace(); }
离开界面时你要在onStop回调中解绑服务:
unbindService(mConnection);
调试命令
adb logcat ZlsamDownloadService:V *:S
Demo
你能够直接build安装并启动ZlsamDownloaderService,代码中自带的TestActivity就是一个测试Demo。