一、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. Technology, globalisation and the squeeze on good jobs

    Technology, globalisation and the squeeze on good jobs技术与全球化冲击好工作“Highest stock market EVER! Jobs ar ...

  2. session会话时间

    session对象失效在下列情况下被删除: A.程序调用HttpSession.invalidate() B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间 ...

  3. ASP.NET MVC 项目文件夹结构

    首先,打开Visual Studio, 新建一个demo 项目的solution,选择 Blank Soution. 第二步,创建文件夹,按自己的需求创建.在这个Demo 中,我将创建4个文件夹. P ...

  4. linux 用户管理(3)----查看用户登录时间以及命令历史

    1.查看当前登录用户信息 who命令: who缺省输出包括用户名.终端类型.登陆日期以及远程主机. who /var/log/wtmp 可以查看自从wtmp文件创建以来的每一次登陆情况 (1)-b:查 ...

  5. 求2的n次方对1e9+7的模,n大约为10的100000次方(费马小定理)

    昨天做了一个题,简化题意后就是求2的n次方对1e9+7的模,其中1<=n<=10100000.这个就算用快速幂加大数也会超时,查了之后才知道这类题是对费马小定理的考察. 费马小定理:假如p ...

  6. suse安装gcc,升级到4.8.5

    前面这些是挂载iso,如果iso可以使用,就不需要下面几步. cd /etc/zypp/repos.d mkdir iso chmod -R 777 iso mount -o loop /media/ ...

  7. 一些常用的c++系统函数

    数学<cmath><math.h>: 1 三角函数 double sin (double); double cos (double); double tan (double); ...

  8. tortoise svn 请求的名称有效,但是找不到请求的类型的数据

    可能是博客园出bug了,现在无法放图,间断重复刷新十多次依然如故,弃之 这个问题是在安装完svn服务器(visual svn)后复制url,tortoise svn import 粘贴url后 出现的 ...

  9. 清空表中数据 id从1开始

    删除表的记录以后,如何使新记录的编号仍然从1开始有两种方法: 方法1: truncate table 你的表名 --这样不但将数据删除,而且可以重新置位identity属性的字段. 方法2: dele ...

  10. 42-python中的矩阵、多维数组----numpy

    xzcfightingup   python中的矩阵.多维数组----numpy 1. 引言 最近在将一个算法由matlab转成python,初学python,很多地方还不熟悉,总体感觉就是上手容易, ...