服务可用在一下情景:
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>
- 通过cmd命令到ftp上下载文件
通过cmd命令到ftp上下载文件 点击"开始"菜单.然后输入"cmd"点"enter"键,出现cmd命令执行框 2 输入"ftp& ...
- PHP实现远程下载文件到本地
PHP实现远程下载文件到本地 投稿:hebedich 字体:[增加 减小] 类型:转载 经常写采集器发布接口需要使用到远程附件的功能,所以自己写了一个PHP远程下载文件到本地的函数,一般情况下已经 ...
- PHP CURL实现远程下载文件到本地
<?php //$result=httpcopy('http://www.phpernote.com/image/logo.gif'); echo '<pre>';print_r($ ...
- Android开发 ---从互联网上下载文件,回调函数,图片压缩、倒转
Android开发 ---从互联网上下载文件,回调函数,图片压缩.倒转 效果图: 描述: 当点击“下载网络图像”按钮时,系统会将图二中的照片在互联网上找到,并显示在图像框中 注意:这个例子并没有将图 ...
- linux远程下载文件 的两种方法之 ftp命令和scp命令
ftp命令: 服务器有安装ftp Server,另外一台linux可以使用ftp的client程序来进行文件的拷贝读取和下载. 1. 连接ftp服务器 格式:ftp [hostname| ip-ad ...
- 【liunx命令】上传下载文件的方法
scp 帮助命令: man scp scp功能: 下载远程文件或者目录到本地, 如果想上传或者想下载目录,最好的办法是采用tar压缩一下,是最明智的选择. 从远程主机 下载东西到 本地电脑 ...
- 批量执行(Linux命令,上传/下载文件)
前言: 每个公司的网络环境大都划分 办公网络.线上网络,之所以划分的主要原因是为了保证线上操作安全: 对于外部用户而言也只能访问线上网络的特定开放端口,那么是什么控制了用户访问线上网络的呢? 防火墙过 ...
- Linux学习笔记:使用ftp命令上传和下载文件
Linux中如何使用ftp命令,包括如何连接ftp服务器,上传or下载文件以及创建文件夹.虽然现在有很多ftp桌面应用(例如:FlashFXP),但是在服务器.SSH.远程会话中掌握命令行ftp的使用 ...
- python3 实现堡垒机功能(并发执行命令及上传下载文件)
转载请注明出处,欢迎提出宝贵意见,谢谢! 功能介绍: 1.主机分组 登录后显示分组主机及主机数量 选择主机组后显示该主机组下所有主机信息,主机名及IP显示输入选择:1.执行命令利用线程并发组内所有主机 ...
随机推荐
- oracle聚簇表的理解 (转自:https://blog.csdn.net/gumengkai/article/details/51009345 )
Oracle支持两种类型的聚簇:索引聚簇和哈希聚簇 一.索引聚簇表的原理 聚簇:如果一些表有一些共同的列,则将这样一组表存储在相同的数据块中 聚簇还表示把相关的数据存储在同一个块上.利用聚簇,一个块可 ...
- 选择客栈(noip2011 day1 t2)
题目描述 丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到 nn n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k−1 表示),且每家客栈都设有一家咖啡店,每 ...
- 创建私有CA并签发证书
一.创建私有CA 1.创建所需要的文件 2.创建私有密钥 3.CA自签证书 -new: 生成新证书签署请求: -x509: 专用于CA生成自签证书:不自签的时候不要加该选项 ...
- DevOps - 项目构建 - Maven
Maven介绍Apache Maven是一个创新的软件项目管理和综合工具.Maven提供了一个基于项目对象模型(POM)文件的新概念来管理项目的构建,可以从一个中心资料片管理项目构建,报告和文件.Ma ...
- jquery添加html代码的几种方法
经常用jq来DOM添加html代码 就总结了jq里面最常用的动态添加html代码的方法 append在元素内部的尾部加上元素 prepend在元素内部的前部加上元素 after在元素外部的尾部加上元素 ...
- keil5 mdk调用外部编辑器notepad++、sublime3、VSCode总结
1.打开keil主界面,点击菜单栏Tools菜单,选择如下图所示的选项. 2.点击如下图所示的菜单上红笔标注的地方,给这个工具命名,如notepad++.sublime3.vscode等,如下图, 并 ...
- 03 mysql补充 (进阶)
增加字段 alter table tb1 add age int first; 增加到第一 alter table tb1 add sex int after id; # 改变位置,id是字段名字 a ...
- python七类之列表元组
列表 一.关键字: list lst = [ , , , , , , ,] lst = [1,2,3,4] 二.方法: 1.增加: . append( ) #追加,添加元素进列表最后 ls ...
- ubuntu64位运行32位程序
sudo dpkg --add-architecture i386 sudo apt install libc6:i386 转:https://blog.csdn.net/zoomdy/article ...
- nodejs环境变量配置
步骤 创建文件夹:安装包 配置环境变量: export NODE_HOME=/root/安装包/node-v7.6.0-linux-x64 export PATH=$NODE_HOME/bin:$PA ...