一、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. tar 压缩文件指定目录

    tar -cjf /app/tmp/app/test.tar.bz2 -C /app/tmp  res_test.csv 将/app/tmp 目录下 res_test.csv文件压缩到/app/tmp ...

  2. Haskell语言学习笔记(67)Gtk2Hs

    Gtk2Hs $ brew cask install xquartz $ brew install glib cairo gtk gettext fontconfig freetype $ expor ...

  3. conductor任务域

    任务域 任务域有助于支持任务开发.这个想法是相同的“任务定义”可以在不同的“域”中实现.域名开发人员控制的任意名称.因此,当工作流程启动时,调用者可以在工作流中的所有任务中指定哪些任务需要在特定域中运 ...

  4. node连续查询两次数据库返回方式(文档未定)

    function db(callback){ var mysql = require('mysql'); var connection = mysql.createConnection({ host ...

  5. sudoers的权限被改,又忘记了root密码,又不能重启。这么做。

    报下面这个错 sudo: /etc/sudoers is world writablesudo: no valid sudoers sources found, quittingsudo: unabl ...

  6. Dubbo 分布式服务框架

    要想了解Dubbo是什么,我们不防先了解它有什么用. 使用场景:比如我想开发一个网上商城项目,这个网上商城呢,比较复杂,分为pc端web管理后台,微信端销售公众号,那么我们分成四个项目,pc端网站,微 ...

  7. 在Linux下配置jdk的环境变量

    jdk下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 在根目录新建s ...

  8. form表单的默认提交行为

    一 如果<form></form>表单中只有一个<input type="text"/>,则使文本框获取焦点,并单击回车,form会自动提交. ...

  9. swift - 封装 GCDTimer 和 NSTimer

    封装的类代码 import UIKit /// 控制定时器的类 class ZDTimerTool: NSObject { /// 定时器 // private var timer: Timer? / ...

  10. Adplus 抓取Crash Dump

    本实例在win8.1 安装window kits https://developer.microsoft.com/en-us/windows/hardware/windows-driver-kit 1 ...