`
jean7155
  • 浏览: 63081 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

使用后台服务下载文件的例子

阅读更多
最近做了一个DEMO, 是通过httpURLConnection服务来下载文件。 大致的设计思路是这样的:
1. 主Activity,显示需要下载的文件名,并通过ProgressDialog来显示下载进度。
2. 后台服务IntentService进行主要的下载操作,先通过HttpURLConnection来获取远程服务的InputStream, 然后将获取的InputStream写入设备的sdCard中。
3. 通过ResultReceiver传递下载的完成信息给ProgressDialog,使其能及时更新下载进度。

具体的代码:
1. 老样子,在AndroidManifest.xml中设置对因特网的访问权限,和对SDCard的操作权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>


2. 其次,需要在AndroidManifest.xml中设置Activity和Service
<activity
            android:name="cn.sh.ideal.activity.DownloadActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>
        
<service android:name="cn.sh.ideal.service.DownloadService"/>


3. 在DownloadActivity中,显示需要下载的文件名,点击文件名,调用DownloadService进行文件的下载,并在界面中产生ProgressDialog进度
				if(fileRealName!=null && fileRealName.trim().length()>0){
					
					fileName = fileRealName;
					
					try {
						url = ToolsUtil.getIpAddress() + URLEncoder.encode(fileRealName,"UTF-8");
					} catch (UnsupportedEncodingException e) {
						e.printStackTrace();
					}
					
					progressDialog = new ProgressDialog(DownloadActivity.this);
					progressDialog.setTitle(getResources().getString(R.string.download_title));
					progressDialog.setMessage(getResources().getString(R.string.download_message));
					progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

					progressDialog.show();
					
					intent = new Intent(DownloadActivity.this, DownloadService.class);
					intent.putExtra("url", url);
					intent.putExtra("filename", fileName);
					intent.putExtra("receiver", new DownloadReceiver(new Handler()));
					intent.setAction("start");
					startService(intent);
					
				}


4. DownloadService 对文件进行下载
	protected void onHandleIntent(Intent intent) {
		 String urlToDownload = intent.getStringExtra("url");
		 String filenameToSave = intent.getStringExtra("filename");
		 
	     ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver");
	     
	 	 String sdPath = "";
		 int results = 0;
		 String infos = "";
		 
		 InputStream input = null;
		 OutputStream output = null;
     
	     try {
                 //设备中是否存在SDCard,如果不存在则抛出异常
	    	 isSDCard();
                 //设备是否可连接,如果不可链接则抛出异常
	    	 isConnected();
	    	 
	    	 sdPath = Environment.getExternalStorageDirectory() + "/" + Constants.DOWNLOAD_PATH;
                 // SDCard中的存储路径是否存在,如果不存在则创建
	    	 File dir = new File(sdPath);
	    	 if(!dir.exists()) createSDDir(sdPath);
	    	 
	    	 sdPath = Environment.getExternalStorageDirectory() + "/" + Constants.DOWNLOAD_PATH + "/" + filenameToSave;
	    	 
                 // 计算需要下载的文件的长度
	    	 long totalSize = getRemoteFilesize(urlToDownload);
	    	 
                 // 计算SDCard的剩余空间是否足够保存下载文件。如果不够,则抛出异常 
	    	 isSDCardFreeSizeAvailable((int)totalSize);
	    	 
    		 URL url = new URL(urlToDownload);
    		 connection = (HttpURLConnection) url.openConnection();
    		 connection.setConnectTimeout(CONNECT_TIME_OUT);
	         
    		 connection.connect();
	         
                 // 获取Http服务的返回信息,如果服务信息为HTTP_OK, HTTP_PARTIAL, 则可进行下载服务,否则抛出异常
    		 int code = getHttpResponseMessage(connection);
    		 Log.i(TAG,"httpReturnType=" + code);
	            
    		 input = new BufferedInputStream(connection.getInputStream());

   			 output =new FileOutputStream(sdPath);

   			 byte data[] = new byte[1024];
   			 long total = 0l;
   			 int count;
   			 while ((count = input.read(data)) != -1) {
   				 total += count;
	                
   				 Bundle resultData = new Bundle();
   				 resultData.putInt("progress" ,(int) (total * 100 / totalSize));
   				 receiver.send(UPDATE_PROGRESS, resultData);
   				 output.write(data, 0, count);
   			 }

   			 output.flush();
   			 output.close();
   			 input.close();
    			 
   	         results = DOWNLOAD_SUCCESS;
	     }
	     catch(SDCardNotAvailableException sdex){
	    	 results = DOWNLOAD_ERROR;
	    	 infos = getResources().getString(R.string.download_error_sdcard_not_available);
	     }
	     catch(AndroidNoActiveConnectionException aex){
	    	 results = DOWNLOAD_ERROR;
	    	 infos = getResources().getString(R.string.download_error_no_active_connection);
		 }
		 catch(SDCardFreeNotAvailableException sdfex){
			 infos =  getResources().getString(R.string.download_error_sdcard_not_free);
	    	 results = DOWNLOAD_ERROR; 
		 }
		 catch(HttpServiceException rex){
	    	 results = DOWNLOAD_ERROR;
	    	 infos = getResources().getString(R.string.download_error_http_service);
		 }
		 catch(FileNotFoundException fex){
			 results = DOWNLOAD_ERROR;
			 infos = getResources().getString(R.string.download_error_file_not_found);
		 }catch(IOException ioex){
			 results = DOWNLOAD_ERROR;
			 infos = getResources().getString(R.string.download_error_io);
		 }
		 catch(Exception ex){
			 results = DOWNLOAD_ERROR;
			 infos = getResources().getString(R.string.download_error_others);
			 Log.e(TAG,ex.getLocalizedMessage());
		 }
		 finally{
			 if(input!=null)
				try {
					input.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			 if(output!=null)
				try {
					output.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			 
			 if(connection!=null) connection.disconnect();
			 
	         Bundle resultData = new Bundle();
	         resultData.putInt("progress" ,results);
	         
	         if(infos!=null && infos.trim().length()>0)
	        	 resultData.putString("resultMessage", infos);
	         
	         receiver.send(UPDATE_PROGRESS, resultData);
	     }

               

5. 在DownloadActivity中添加DownloadReceiver类,用以接收DownloadService的下载进度信息和错误信息
	private class DownloadReceiver extends ResultReceiver{
	    public DownloadReceiver(Handler handler) {
	        super(handler);
	    }

	    protected void onReceiveResult(int resultCode, Bundle resultData) {
	        super.onReceiveResult(resultCode, resultData);
	        
	        if (resultCode == DownloadService.UPDATE_PROGRESS) {
	            int progress = resultData.getInt("progress");
	            
	            if(progress == DownloadService.DOWNLOAD_ERROR){
	            	String infos = resultData.getString("resultMessage");
	            	progressDialog.dismiss();
	            	Toast.makeText(DownloadActivity.this, infos, Toast.LENGTH_SHORT).show();

	            }else if(progress == DownloadService.DOWNLOAD_SUCCESS){
	            	progressDialog.dismiss();
	            
	            }else{
	            	progressDialog.setProgress(progress);
	            }
	        }
	    }


附件中提供了这个DEMO的完整代码。
分享到:
评论

相关推荐

    iphone文件下载模块代码例子

    在iOS开发中,iPhone文件下载模块是至关重要的一个部分,特别是在构建移动应用时,用户可能需要从服务器上获取各种文件,如图片、音频、视频、文档等。`FFDownloadManager`是一个可能的自定义下载管理器类名,用于...

    Vue调用SpringBoot后台实现文件下载功能

    本案例探讨的就是如何使用Vue调用SpringBoot后台来实现文件下载功能,这对于构建交互性强、用户体验良好的Web应用来说是必不可少的。 首先,我们需要了解Vue.js的基本知识。Vue是一个轻量级的JavaScript框架,它...

    android客户端与后台服务器交互

    本示例探讨了如何实现Android客户端与基于Struts、Hibernate和Spring的后台服务器之间的数据交互,使用JSON作为数据传输格式。对于初学者来说,这是一个很好的起点,因为它涵盖了多个关键的技术栈。 首先,让我们...

    易语言例子 小麦简单下载站源码后台版

    "易语言例子 小麦简单下载站源码后台版"是一个关于使用易语言开发的下载网站后台管理系统。易语言是一种中文编程语言,旨在降低编程难度,让更多人能够参与到编程中来。这个源码提供了用于创建和管理下载站点的后端...

    asp.net(C#)限速下载隐藏文件真实名称和地址下载的例子

    在ASP.NET(C#)开发中,有时我们需要对网站上的文件下载功能进行控制,例如限制下载速度,隐藏文件的真实路径和名称,以保护服务器资源的安全。本示例将讲解如何实现这些功能,主要针对VS2005(.NET Framework 2.0)...

    后端接口文档例子 word

    "后端接口文档详解" 在本文档中,我们将详细介绍后端接口文档的编写,特别是Java接口文档的编写。通过本文档,我们将了解后端接口文档的重要性、编写格式、请求参数、返回参数等方面的知识点。 一、为什么需要后端...

    android下载文件小例子,带进度条显示

    如果应用被杀死,那么可能需要使用服务或者前台通知来保证下载任务的继续。 7. **错误处理**:在实际的下载过程中,可能会遇到网络连接失败、文件写入错误等各种问题,因此良好的错误处理机制是必不可少的。这包括...

    红兔子网盘进度下载文件例子

    这通常涉及到JavaScript或Web前端框架(如React、Vue.js等)的使用,它们负责与后台通信,实时更新下载进度条。 总的来说,红兔子网盘的进度下载功能涉及到了网络协议、服务器端的文件状态管理、客户端的数据处理...

    演示Android下载文件的例子

    本文将深入探讨如何在Android中实现文件下载,以满足"演示Android下载文件的例子"的需求。 首先,我们需要了解Android的权限管理。在Android 6.0(API级别23)及以上版本,你需要在运行时请求`WRITE_EXTERNAL_...

    Windows 8下如何使用后台并发任务的例子代码

    这个方法将包含实际的并发任务逻辑,如下载数据、处理文件等。`Run`方法应尽可能高效,因为后台任务的执行时间受到限制,以防止消耗过多系统资源。 ```csharp using System; using System.Threading.Tasks; using ...

    系统后台服务.zip易语言程序源码资源下载

    例如,邮件服务器、任务调度器、数据库管理等都是后台服务的例子。在易语言中,创建后台服务需要理解操作系统相关的API调用和事件处理机制。 这份资源可能包括以下几个方面的知识点: 1. **易语言基础**:易语言的...

    easyUI例子_easyui1.4.4_一套EASYUI的经典后台管理模板_jquery_

    这个"easyUI例子_easyui1.4.4"压缩包提供了一套使用 EasyUI 1.4.4 版本的经典后台管理模板,适用于开发人员快速搭建功能丰富的管理界面。 EasyUI 的核心特点是组件化和模块化,它包括一系列预定义的 CSS 样式和 ...

    后台springBoot+jdbc例子

    在这个"后台springBoot+jdbc例子"中,我们将探讨SpringBoot如何与Java数据库连接(JDBC)结合使用,实现数据的增删改查操作。 首先,让我们从项目结构开始。在"springBootDemo"这个项目中,我们通常会看到以下主要...

    使用Spring Cloud Netflix Zuul代理网关访问后台REST服务例子

    本文将详细介绍如何使用Spring Cloud Netflix Zuul作为代理网关来访问后台REST服务,以及如何实现前端与后端的分离部署。 首先,让我们理解Zuul的角色。Zuul作为API网关,主要负责以下任务: 1. **路由转发**:它...

    自动链接ACCESS 后台数据库的例子

    3. **触发重新链接**: 可以在应用程序启动时运行这段VBA代码,或者在检测到后台文件缺失时自动执行。这样,无论后台数据库移动到哪里,只要用户输入正确的路径,前端就能自动恢复链接。 4. **最佳实践**: 为了防止...

    iOS后台运行的几种方式例子

    5. **持续执行(延长的后台执行)**:尽管iOS不鼓励无限后台运行,但开发者可以通过巧妙设计,如使用定位服务或音频播放来模拟无限后台。然而,Apple对这种行为有严格的审查,过度使用可能会导致应用被拒或被用户...

    微软Ajax异步调用页面后台类和WebSerivce例子

    具体到“TestAsynchronism”这个压缩包中的文件,很可能是包含了一个或者多个测试示例,演示了如何使用Ajax调用页面后台类的方法以及WebService。可能包含了ASPX页面、对应的后台代码文件、以及一个或多个ASMX文件。...

    dubbo-admin 后台服务

    【标题】"dubbo-admin 后台服务"是Dubbo框架中的一个重要组成部分,它提供了一个可视化的管理界面,用于监控和服务治理。这个后台服务旨在帮助开发者和运维人员更直观地了解和管理分布式服务环境,包括服务注册、...

    windows服务例子与使用说明

    本教程将深入探讨“windows服务例子与使用说明”,通过一个具体的定时关机服务示例,帮助你理解如何创建、控制和管理Windows服务。 首先,我们来看“ws1-第一个成功的服务程序”。这是一个基础的Windows服务应用...

Global site tag (gtag.js) - Google Analytics