我的应用程序有很多可以下载的可选数据,所以我决定使用服务来处理后台的所有下载,所以我开始学习它,这是我得到的地方:
public class DownloadService extends IntentService{
public DownloadService() {
super("DownloadService");
}
@Override
protected void onHandleIntent(Intent intent) {
String URL=intent.getStringExtra("DownloadService_URL");
String FileName=intent.getStringExtra("DownloadService_FILENAME");
String Path=intent.getStringExtra("DownloadService_PATH");
try{
URL url = new URL(URL);
URLConnection conexion = url.openConnection();
conexion.connect();
InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream(Path+FileName);
byte data[] = new byte[1024];
int count = 0;
while ((count = input.read(data)) != -1) {
output.write(data);
}
output.flush();
output.close();
input.close();
}
catch(Exception e){ }
}
}
主要活动的代码:
Intent ServiceIntent = new Intent(this,DownloadService.class);
ServiceIntent.putExtra("DownloadService_URL", "the url...");
ServiceIntent.putExtra("DownloadService_FILENAME", "Test1.rar");
ServiceIntent.putExtra("DownloadService_PATH", "/sdcard/test/");
startService(ServiceIntent);
感谢。
答案 0 :(得分:9)
用于下载文件的代码是否正确?
我不喜欢使用连接来创建完全限定的文件路径(使用适当的File
构造函数)。捕捉异常并且不对它们做任何事情是一个非常糟糕的主意。在Android 2.3及更高版本中,您应该考虑使用DownloadManager
。
否则,基本的东西可能就好了。
我想下载很多文件..那么我应该为每个不同的URL启动服务吗?
这应该可以正常工作。请注意,它们将一次下载一个,因为IntentService
只有一个后台主题。
我想告诉用户完成的百分比..但是服务没有UI。我应该在通知栏中这样做吗?
那将是一个解决方案。这样做的一个变体是让服务发送有序广播,如果它仍然在屏幕上,或者由BroadcastReceiver
执行Notification
,则由您的活动选择。 Here is a blog post了解更多内容,here is a tiny sample application展示了这一概念。