服务可用在一下情景:

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>


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

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

    通过cmd命令到ftp上下载文件 点击"开始"菜单.然后输入"cmd"点"enter"键,出现cmd命令执行框 2 输入"ftp& ...

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

    PHP实现远程下载文件到本地 投稿:hebedich 字体:[增加 减小] 类型:转载   经常写采集器发布接口需要使用到远程附件的功能,所以自己写了一个PHP远程下载文件到本地的函数,一般情况下已经 ...

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

    <?php //$result=httpcopy('http://www.phpernote.com/image/logo.gif'); echo '<pre>';print_r($ ...

  4. Android开发 ---从互联网上下载文件,回调函数,图片压缩、倒转

     Android开发 ---从互联网上下载文件,回调函数,图片压缩.倒转 效果图: 描述: 当点击“下载网络图像”按钮时,系统会将图二中的照片在互联网上找到,并显示在图像框中 注意:这个例子并没有将图 ...

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

    ftp命令: 服务器有安装ftp Server,另外一台linux可以使用ftp的client程序来进行文件的拷贝读取和下载. 1. 连接ftp服务器  格式:ftp [hostname| ip-ad ...

  6. 【liunx命令】上传下载文件的方法

    scp   帮助命令: man scp   scp功能: 下载远程文件或者目录到本地, 如果想上传或者想下载目录,最好的办法是采用tar压缩一下,是最明智的选择.   从远程主机 下载东西到 本地电脑 ...

  7. 批量执行(Linux命令,上传/下载文件)

    前言: 每个公司的网络环境大都划分 办公网络.线上网络,之所以划分的主要原因是为了保证线上操作安全: 对于外部用户而言也只能访问线上网络的特定开放端口,那么是什么控制了用户访问线上网络的呢? 防火墙过 ...

  8. Linux学习笔记:使用ftp命令上传和下载文件

    Linux中如何使用ftp命令,包括如何连接ftp服务器,上传or下载文件以及创建文件夹.虽然现在有很多ftp桌面应用(例如:FlashFXP),但是在服务器.SSH.远程会话中掌握命令行ftp的使用 ...

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

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

随机推荐

  1. Object C学习笔记20-结构体(转)

    在学习Object C中的过程中,关于struct的资料貌似非常少,查阅了C方面的资料总结了一些学习心得! 一. 定义结构 结构体是一种数据类型的组合和数据抽象.结构体的定义语法如下: struct ...

  2. 蚯蚓(noip2016,贪心,单调性)

    题目描述 本题中,我们将用符号⌊c⌋ 表示对 c 向下取整,例如:⌊3.0⌋=⌊3.1⌋=⌊3.9⌋=3 . 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭 ...

  3. linux下的shadow文件解释

    /etc/shadow //用户密码文件登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志 root:$1$202cb962ac59075b964b0 ...

  4. what is feeding and what is 读扩散 and 写扩散?

    what is feeding? 通俗点说feed系统就是当你登陆进对应网站后:微信朋友圈的动态.人人网上看到的一件件新鲜事.新浪微博上推到你面前的一条条新围脖等等.系统中的每一条消息就是一个feed ...

  5. Docker与FastDFS的安装命令及使用

    Docker特点 1)上手快 用户只需要几分钟,就可以把自己的程序“Docker 化”.Docker 依赖于“写时复制” (copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心 ...

  6. Python练习笔记(2)

    文件读写,多线程.多进程 import time,os,threading,random def file_read(path): try: with open(path, 'r') as f: # ...

  7. 07 json与os模块(进阶)

    json和os模块 阶段一 .数据交换 1.json的基本介绍 JSON全名是JavaScript Object Notation(即:JavaScript对象标记)它是JavaScript的子集. ...

  8. 常用 css html 样式

    CSS基础必学列表 CSS width宽度 CSS height高度 CSS border边框 CSS background背景 CSS sprites背景拼合 CSS float浮动 CSS mar ...

  9. ruby net/http模块使用

    ruby中的NET::HTTP:这里暂时先列出几个固定用法: 其中一,二不支持请求头设置(header取ruby默认值),只能用于基本的请求,不支持持久连接,如果您执行许多HTTP请求,则不推荐它们: ...

  10. PHP中的mysql_unbuffered_query与mysql_query的区别

    对于mysql_query大家都很熟悉,下面先简单介绍下mysql_unbuffered_query mysql_unbuffered_query (PHP 4 >= 4.0.6, PHP 5) ...