一、IntentService与Service的区别

Service 是 Android 四大组件之一,正常来说,我们直接使用 Service 就可以了。

但是 Service 存在几个问题:

  1. 默认不会运行在单独的进程中,而是和所在应用共用同一个进程。
  2. Service 也是在主线程中运行,所以一些耗时操作,依然需要单独开启线程去执行。

第一个问题其实并不是什么大的问题,但是正常来说,我们使用 Service 就是想在后台执行一些其他的操作,例如:下载等,而这些,又需要额外开启线程来完成任务,这样无形之中加大了我们的代码量。

而 IntentService 就是为这个而生的。

二、什么是IntentService

IntentService 是继承自 Service 的,所以它本质上还是一个 Service 。在 IntentService 内部维护了一个 WorkerThread 来专门处理耗时操作,实际上它会将所有 IntentService 的业务操作都放在 WorkerThread 中执行。

如果 start 了多次相同的 IntentService ,那么每一次 start 的任务,都会在 WorkerThread 中依次执行。而最让我们省心的是,IntentService 在执行完这些任务之后,会调用 stopSelf() 结束自己。

从官方文档可以了解到,一些 IntentService 的特点:

它会创建独立的 WorkerThread 来处理所有的 Intent 请求。

它会创建独立的 WorkerThread 来处理 onHandleIntent() 的实现代码,无需担心多线程的问题。

所有请求完成之后,IntentService 会自动停止。

它的 onBind() 默认返回 null,不要去实现它,不要用 bindService() 绑定一个 IntentService。

它的 onStartCommand() 提供了默认的实现,会将请求的 Intent 添加到队列中。

从上面的介绍可以了解到,在 IntentService 开启了一个独立的 WorkerThread 来完成具体任务的执行,而我们只需要将需要完成的业务代码,在 onHandleIntent() 中实现即可。

三、实现步骤

步骤1:定义IntentService的子类:传入线程名称、复写onHandleIntent()方法

 步骤2:在Manifest.xml中注册服务

步骤3:在Activity中开启Service服务

四、具体实例(来源http://www.jianshu.com/p/8a3c44a9173a)

(1)步骤1:定义IntentService的子类:传入线程名称、复写onHandleIntent()方法

public class myIntentService extends IntentService {

    /*构造函数*/
public myIntentService() {
//调用父类的构造函数
//构造函数参数=工作线程的名字
super("myIntentService"); } /*复写onHandleIntent()方法*/
//实现耗时任务的操作
@Override
protected void onHandleIntent(Intent intent) {
//根据Intent的不同进行不同的事务处理
String taskName = intent.getExtras().getString("taskName");
switch (taskName) {
case "task1"://做耗时操作任务1
Log.i("myIntentService", "do task1");
break;
case "task2"://做耗时操作任务2
Log.i("myIntentService", "do task2");
break;
default:
break;
}
} @Override
public void onCreate() {
Log.i("myIntentService", "onCreate");
super.onCreate();
} /*复写onStartCommand()方法*/
//默认实现将请求的Intent添加到工作队列里
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("myIntentService", "onStartCommand");
return super.onStartCommand(intent, flags, startId);
} @Override
public void onDestroy() {
Log.i("myIntentService", "onDestroy");
super.onDestroy();
}
}

(2)步骤2:在Manifest.xml中注册服务

<service android:name=".myIntentService">
<intent-filter >
<action android:name="cn.scu.finch"/>
</intent-filter>
</service>

(3)步骤3:在Activity中开启Service服务

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //同一服务只会开启一个工作线程
//在onHandleIntent函数里依次处理intent请求。 Intent i = new Intent("cn.scu.finch");
Bundle bundle = new Bundle();
bundle.putString("taskName", "task1");
i.putExtras(bundle);
startService(i); Intent i2 = new Intent("cn.scu.finch");
Bundle bundle2 = new Bundle();
bundle2.putString("taskName", "task2");
i2.putExtras(bundle2);
startService(i2); startService(i); //多次启动
}
}

201709015工作日记--IntentService使用的更多相关文章

  1. 201709015工作日记--上下文的理解,ASM

    1.Android上下文理解 Android上下文对象,在Context中封装一个所谓的“语境”,Activity.Service.Application都继承自Context,所以在这三者创建时都会 ...

  2. 201709013工作日记--Android消息机制HandlerThread

    1.首先来看一个常规的handler用法: 在主线程中建立一个handler: private Handler mHandler = new Handler() { @Override public ...

  3. 201709012工作日记--activity与service的通信机制

    service生命周期 Service主要包含本地类和远程类. Service不是Thread,Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 ...

  4. 201709011工作日记--ART与Dalvik&&静态类与非静态类

    1.ART 与 Dalvik 的优缺点对比 什么是Dalvik:Dalvik是Google公司自己设计用于Android平台的Java虚拟机.dex格式是专为Dalvik应用设计的一种压缩格.Dalv ...

  5. 201709011工作日记--Volley源码详解(二)

    1.Cache接口和DiskBasedCache实现类 首先,DiskBasedCache类是Cache接口的实现类,因此我们需要先把Cache接口中的方法搞明白. 首先分析下Cache接口中的东西, ...

  6. 20170908工作日记--Volley源码详解

    Volley没有jar包,需要从官网上下载源码自己编译出来,或者做成相关moudle引入项目中.我们先从最简单的使用方法入手进行分析: //创建一个网络请求队列 RequestQueue reques ...

  7. 20170906工作日记--volley源码的相关方法细节学习

    1. 在StringRequest类中的75行--new String();使用方法 /** * 工作线程将会调用这个方法 * @param response Response from the ne ...

  8. 工作日记之查看Linux系统里面的启动频率2017_02_07

    链接:http://www.jb51.net/LINUXjishu/19905.html 查看Linux里面的batch: cat /etc/crontab (1)0 19 * * 6 root /d ...

  9. angularJs工作日记-自定义指令Directive01

    新项目组使用完善的angularMVVM设计思路架构,很庆幸能够来到这个项目组,在这里的每一天都能够学习到新的知识,为了防止以后忘记,记录一下个人的理解 首先接触最多的是directive,direc ...

随机推荐

  1. Mysql 知识(2)

    1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一 ...

  2. 书单BookList

    1. <代码大全> 史蒂夫·迈克康奈尔 (Code Complete) 2. <程序员修炼之道> Andrew Hunt [读过了,非常好的一本书] (Pragmatic Pr ...

  3. 批量压缩文件.net

    C#调用 ICSharpCode.SharpZipLib.Zip 实现解压缩功能公用类 最近想用个解压缩功能 从网上找了找 加自己修改,个人感觉还是比较好用的,直接上代码如下 using System ...

  4. delphi 图片加水印源代码

    unit UWaterMark; interface uses {$IFNDEF DELPHIXE2ANDUP} windows,SysUtils,classes,graphics,Gdiplus; ...

  5. linux下的计算器

    (1)bc bc在默认的情况下是个交互式的指令.在bc工作环境下,可以使用以下计算符号:+ 加法 - 减法 * 乘法 / 除法 ^ 指数 % 余数如: 3+4;5*2;5^2;18/4      &l ...

  6. SQL查询效率where语句条件

    有索引的列优先,都有索引的看查询出来的数据量,少的优先 in ,not in,<>,is null,is not null 等由于不会走索引,尽量不要使用. WHERE子句后面的条件顺序对 ...

  7. 第五章 二叉树(e2)中序遍历

  8. cdoj203-Islands 【并查集】

    http://acm.uestc.edu.cn/#/problem/show/203 Islands Time Limit: 30000/10000MS (Java/Others)     Memor ...

  9. tf.random_normal()

    tf.random_normal()函数用于从服从指定正太分布的数值中取出指定个数的值. tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf. ...

  10. Java 深浅拷贝

    2016-07-02 1深拷贝:不仅拷贝对象,而且对象所引用地址的内容一块拷贝.改变一个对象的某个属性,并不影响另一个对象所引用的内容. 2浅拷贝:仅拷贝对象本身,并不对所引用(所指的)内容进行拷贝, ...