我想知道下载管理器的机制(not the DownloadManager class introduced in API 9
),就像我目前的项目一样,我需要实现与下载管理器相同的一些东西。
我的基本理解是它使用服务来下载文件。但我无法理解的是它将如何处理多文件下载请求,例如。目前正在下载文件。现在用户添加了另一个要下载的文件。我不认为单个服务可以处理它。它可以?还是有其他方法可以做到这一点?有什么建议吗?
如果问题不够清楚,PS原谅我,因为我自己并不清楚地理解我的怀疑。 :(答案 0 :(得分:1)
他们正在使用MultiThreaded Socket Wheel。
意味着,有一个ForegroundService可以处理服务中不同的线程。
ForegroundService确保它将保持活动状态。线程本身是在后台线程中运行的单个进程。
Threre是几个可用的ThreadExecutors,它们确保你只有几个Threads运行并行或逐个线程处理它们。
这是一个制作SocketWheel http://www.javaspecialists.eu/archive/Issue023.html
的好教程来源:
ThreadExecutor http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html
ThreadPoolExecutor ExectuorService vs ThreadPoolExecutor (which is using LinkedBlockingQueue)
ForegroundService Android - implementing startForeground for a service?
编辑:代码
public class DLService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Notification note=new Notification(R.drawable.somegraphics, "some title", randomnr);
Intent i=new Intent(this, ActivityClassToOpenWhenClicked.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pi=PendingIntent.getActivity(this, 0, i, 0);
note.setLatestEventInfo(this, "downloadmanager","downloading.. nothing", pi);
note.flags|=Notification.FLAG_NO_CLEAR;
startForeground(1337, note);
// if (intent.hasExtra("dlurl")) {
new Thread(new Runnable() {
public void run() {
new Client("http://yourfile.com/file.jpg");
}
}).start();
return START_NOT_STICKY;
}
class Client {
public Client(String filetodownload) throws Exception {
//do your http connection. for example one download #
// HttpUrlConnection httpConnection = new .....
}
}
}
它只是一个快速编码的例子,没有经过测试。但它显示了这个概念。 服务本身接受一个Intent,它可以是文件所在的url。然后它创建一个新的线程来完成这项工作。线程将在下载文件时运行。 foregroundService确保服务保持活动状态。您还可以创建一个ThreadPoolExecutor,它在onec处理多个Thread。请阅读http://developer.android.com/training/multiple-threads/create-threadpool.html以获取相关说明。