下载管理器如何在Android上运行?

时间:2014-06-09 13:50:34

标签: java android service

我想知道下载管理器的机制(not the DownloadManager class introduced in API 9),就像我目前的项目一样,我需要实现与下载管理器相同的一些东西。

我的基本理解是它使用服务来下载文件。但我无法理解的是它将如何处理多文件下载请求,例如。目前正在下载文件。现在用户添加了另一个要下载的文件。我不认为单个服务可以处理它。它可以?还是有其他方法可以做到这一点?有什么建议吗?

如果问题不够清楚,PS原谅我,因为我自己并不清楚地理解我的怀疑。 :(

1 个答案:

答案 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 .....
 }
}
}

它只是一个快速编码的例子,没有经过测试。但它显示了这个概念。 服务本身接受一个I​​ntent,它可以是文件所在的url。然后它创建一个新的线程来完成这项工作。线程将在下载文件时运行。 foregroundService确保服务保持活动状态。您还可以创建一个ThreadPoolExecutor,它在onec处理多个Thread。请阅读http://developer.android.com/training/multiple-threads/create-threadpool.html以获取相关说明。