android命令模式IntentService 远程下载文件

服务可用在一下情景:

1,用户离开activity后,仍需要继续工作,例如从网络下载文件,播放音乐.

2,无论activity出现或离开,都需要持续工作,例如网络聊天应用.

3,连接网络服务,正在使用一个远程API提供的服务.

4,定时触发的任务

1.因为IntentService是Service子类,所以也需要在manifest中声明服务

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.intentservicedemo"

android:versionCode="1"

android:versionName="1.0" >

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="21" />

<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name=".MainActivity"

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="com.example.intentservicedemo.ServiceDownloader"></service>

</application>

</manifest>

2,新建 ServiceDownloader 继承自 IntentService

public class ServiceDownloader extends IntentService {

//避免出现命名重复,将类的命名空间加在前面

public static final String EXTRA_MESSAGER="com.wei.android.learning.ServiceDownloader.EXTRA_MESSAGER";

public ServiceDownloader() {

super("ServiceDownloader");

}

//命令模式的服务由client请求服务,

private HttpClient client=null;

int result ;

private Intent mIntent;

//client通过startService请求服务时,如果没有开启,则会首先执行onCreate(),在这里做一些初始化的工作,onCreate是在主线程中运行

@Override

public void onCreate() {

super.onCreate();

client=new DefaultHttpClient();

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

return super.onStartCommand(intent, flags, startId);

}

//再收到客户端命令,处理完onStartCommand()后执行,onHandleIntent()是在后台线程中运行

@Override

protected void onHandleIntent(Intent i) {

this.mIntent=i;

result = Activity.RESULT_CANCELED;

HttpGet get=new HttpGet(i.getData().toString());

ResponseHandler<byte[]> responseHandler =new ByteArrayResponseHandler();

try {

byte[] responseByte=client.execute(get,responseHandler);

File output=new File(Environment.getExternalStorageDirectory(),i.getData().getLastPathSegment());

if(output.exists()){

output.delete();

}

FileOutputStream fos=new FileOutputStream(output.getPath());

fos.write(responseByte);

fos.close();

result=Activity.RESULT_OK;

} catch (ClientProtocolException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

Bundle extras=i.getExtras();

if(extras!=null){

Messenger messenger =(Messenger) extras.get(EXTRA_MESSAGER);

Message msg=Message.obtain();

msg.arg1=result;

try {

messenger.send(msg);

} catch (RemoteException e) {

e.printStackTrace();

}

}

}

@Override

public void onDestroy() {

Bundle extras=mIntent.getExtras();

if(extras!=null){

Messenger messenger =(Messenger) extras.get(EXTRA_MESSAGER);

Message msg=Message.obtain();

msg.arg1=result;

try {

messenger.send(msg);

} catch (RemoteException e) {

e.printStackTrace();

}

}

client.getConnectionManager().shutdown();

super.onDestroy();

}

private class ByteArrayResponseHandler implements ResponseHandler<byte[]>{

@Override

public byte[] handleResponse(HttpResponse response)

throws ClientProtocolException, IOException {

StatusLine statusLine=response.getStatusLine();

if(statusLine.getStatusCode()>300){

throw new HttpResponseException(statusLine.getStatusCode(),statusLine.getReasonPhrase());

}

HttpEntity entity=response.getEntity();

if(entity==null){

return null;

}

return EntityUtils.toByteArray(entity);

}

}

}

3,在客户端调用服务,开启下载任务,并且在下载完成时,可以收到下载完成的消息

public class MainActivity extends ActionBarActivity {

Button btn_start;

Button btn_stop;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btn_start=(Button) findViewById(R.id.btn_start);

btn_stop=(Button) findViewById(R.id.btn_stop);

btn_start.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

startDownLoader();

}

});

btn_stop.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) {

stopDownLoader();

}

});

}

private void startDownLoader(){

Intent intent=new Intent(this, ServiceDownloader.class);

intent.setData(Uri.parse("http://commonsware.com/Android/excerpt.pdf"));

intent.putExtra(ServiceDownloader.EXTRA_MESSAGER,new Messenger(mh));

startService(intent);

}

private Handler mh=new Handler(){

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

//下载完成后,将取消服务按钮失效

switch (msg.arg1) {

case Activity.RESULT_OK:

Toast.makeText(MainActivity.this, "Result : OK " , Toast.LENGTH_LONG).show();

break;

case Activity.RESULT_CANCELED:

Toast.makeText(MainActivity.this, "Result : Cancel " , Toast.LENGTH_LONG).show();

break;

default:

break;

}

}

};

private void stopDownLoader(){

stopService(new Intent(this, ServiceDownloader.class));

}

}

4,activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="com.example.intentservicedemo.MainActivity" >

<Button

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="start"

android:id="@+id/btn_start"

/>

<Button

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="stop"

android:id="@+id/btn_stop"

/>

</LinearLayout>

来自为知笔记(Wiz)

时间: 2024-10-24 10:34:16

android命令模式IntentService 远程下载文件的相关文章

通过cmd命令到ftp上下载文件

通过cmd命令到ftp上下载文件 点击"开始"菜单.然后输入"cmd"点"enter"键,出现cmd命令执行框 2 输入"ftp"切换到到ftp下面.然后输入"open 服务器地址".点击回车键.会提示你输入用户名和密码. 3 登陆成功后.输入"cd"命令.会显示"远程目录",输入"dir"命令会显示目录下的文件,权限等相关信息.可以通过"

JAVA远程下载文件并读取实例方法

简单的文件下载后读取显示,该方法可返回内容的结果集.一般适用于文本文档的下载,以供学习交流. ** * 远程下载文件并读取返回p * @param filePath 文件网络地址 如http://www.baidu.com/1.txt * @return String */ public String DownAndReadFile(String filePath){ String date = new SimpleDateFormat("yyyy-MM-dd").format(new

PHP CURL实现远程下载文件到本地

<?php //$result=httpcopy('http://www.phpernote.com/image/logo.gif'); echo '<pre>';print_r($result); function httpcopy($url,$file='',$timeout=60){ $file=empty($file)?pathinfo($url,PATHINFO_BASENAME):$file; $dir=pathinfo($file,PATHINFO_DIRNAME); !i

linux远程下载文件 的两种方法之 ftp命令和scp命令

ftp命令: 服务器有安装ftp Server,另外一台linux可以使用ftp的client程序来进行文件的拷贝读取和下载. 1. 连接ftp服务器  格式:ftp [hostname| ip-address] a)在linux命令行下输入:ftp 192.168.26.66 b)服务器询问你用户名和口令,分别输入用户名和相应密码,待认证通过即可. 2. 下载文件 下载文件通常用get和mget这两条命令. a) get  格式:get [remote-file] [local-file] 将

Linux远程下载文件的两种方法之 ftp命令和scp命令

ftp命令: 服务器有安装ftp Server,另外一台linux可以使用ftp的client程序来进行文件的拷贝读取和下载. 1. 连接ftp服务器  格式:ftp [hostname| ip-address] a)在linux命令行下输入:ftp 192.168.26.66 b)服务器询问你用户名和口令,分别输入用户名和相应密码,待认证通过即可. 2. 下载文件 下载文件通常用get和mget这两条命令. a) get  格式:get [remote-file] [local-file] 将

python3 实现堡垒机功能(并发执行命令及上传下载文件)

转载请注明出处,欢迎提出宝贵意见,谢谢! 功能介绍: 1.主机分组 登录后显示分组主机及主机数量 选择主机组后显示该主机组下所有主机信息,主机名及IP显示输入选择:1.执行命令利用线程并发组内所有主机同时执行命令,并将结果,返回格式为:----------------------host1------------------ ----------------------host2------------------ ----------------------host3-------------

centos如何在命令行中使用 ftp 命令上传和下载文件

本文中,介绍在 Linux shell 中如何使用 ftp 命令.包括如何连接 FTP 服务器,上传或下载文件以及创建文件夹.尽管现在有许多不错的 FTP 桌面应用,但是在服务器.SSH.远程会话中命令行 ftp 命令还是有很多应用的.比如.需要服务器从 ftp 仓库拉取备份. 步骤 1: 建立 FTP 连接 想要连接 FTP 服务器,在命令上中先输入ftp然后空格跟上 FTP 服务器的域名 'domain.com' 或者 IP 地址 例如: ftp domain.com ftp 192.168

android开发步步为营之67:使用android开源项目android-async-http异步下载文件

android-async-http项目地址 https://github.com/loopj/android-async-http,android-async-http顾名思义是异步的http请求,不过它也支持同步请求的,本文主要使用了android-async-http做异步请求下载文件.每当app需要更新新版本的时候,就需要用到下载功能的,经研究android-async-http这个第三方开源项目还是挺好用的,这里介绍给大家.     1.下载类DownloadManager.java

tomcat-5.0.28在https模式下无法下载文件问题解决

PS: 此web.xml中的security-constraint写法: 在tomcat-5.0.28中以http形式访问其web应用时[无法]自动跳转https 在tomcat-5.5.20中以http形式访问其web应用时[可以自动跳转到https] 环境 tomcat-5.0.28(配置https),jdk1.6 web应用web.xml安全相关配置: <security-constraint> <web-resource-collection> <web-resour