首先说下,其他概念:Android中的本地服务与远程服务是什么?

本地服务:LocalService 应用程序内部------startService
远程服务:RemoteService android系统的应用程序间 ---- bindService
它可以通过自己定义并暴露出来的接口进行程序操作。客户端建立一个到服务对象的连接,并通过那个连接来调用服务。连接以调用Context.bindService()方法建立,以调用 Context.unbindService()关闭。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。可被其他应用程序复用,比如天气预报服务,其他应用程序不需要再写这样的服务,调用已有的即可。

而今天所要说的是IntentService,它是继承自Service的抽象类,Looper Handler Service的集合体,可处理异步请求。

IntentService是借助于消息队列实现的,所以任务的执行顺序就是一个queue的形式;
由于是单线程(一个工作线程),所以所有的任务需要排队执行,不适合大多数的多任务情况;(缺点)
避免了我们再去创建线程和管理service的结束工作; (优点)
-----用户只需重写onHandleIntent()方法即可,处理任务的操作写入该方法中,不需重新创建线程,打印线程ID可发现是独立的工作线程.

demo代码太简单,便于以后查看,如截图

IntentServiceTest.java自己写的类,继承IntentService,重写onHandleIntent()方法,并在其各个生命周期中打印log,运行效果如截图。

关于IntentService消息处理及Service服务停止,源码如下:
IntentService.java消息处理

private final class ServiceHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
}

Service.java停止服务

public final void stopSelf(int startId) {
if (mActivityManager == null) {
return;
}
try {
mActivityManager.stopServiceToken(
new ComponentName(this, mClassName), mToken, startId);
} catch (RemoteException ex) {
}
}

由上述可知,IntentService在处理完任务后,会自动调用stopSelf(),因此:IntentService在处理完所有任务后会被关闭

//stopSelf()-->IActivityManager的stopServiceToken()[实际为ActivityManagerService]--->ActiveServices的stopServiceTokenLocked();真正的处理在stopServiceTokenLocked()中,仅当startId为最后一次请求的id时才真正close Service也在该方法中。

关于stopServiceToken执行原理:http://blog.csdn.net/cloudwu007/article/details/6914470

//ActivityManagerService:stopServiceToken当遇到请求stopService时,仅当startId为最后一次请求的id时才真正close Service.
//ActivityManagerService源码目录: frameworks\base\services\core\java\com\android\server\am\...

其他相关链接:
ActivityManagerService详细介绍: http://www.myexception.cn/android/1979452.html
Service相关:http://android.blog.51cto.com/268543/527314

最后,感谢上述链接的作者!并欢迎大家指正

Android中的IntentService的更多相关文章

  1. Android中使用IntentService运行后台任务

    IntentService提供了一种在后台线程中运行任务的方式,适合处理运行时间较长的后台任务. 长处: (1)IntentService执行在单独的线程中.不会堵塞UI线程 (2)IntentSer ...

  2. android 中IntentService的作用及使用

    IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同 ...

  3. Android中Services之异步IntentService

    IntentService:异步处理服务,新开一个线程:handlerThread在线程中发消息,然后接受处理完成后,会清理线程,并且关掉服务. IntentService有以下特点: (1)  它创 ...

  4. Android中IntentService与Service

    Android中的Service是用于后台服务的,当应用程序被挂到后台的时候,问了保证应用某些组件仍然可以工作而引入了Service这个概念,那么这里面要强调的是Service不是独立的进程,也不是独 ...

  5. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  6. 在Android中使用并发来提高速度和性能

    Android框架提供了很实用的异步处理类.然而它们中的大多数在一个单一的后台线程中排队.当你需要多个线程时你是怎么做的? 众所周知,UI更新发生在UI线程(也称为主线程).在主线程中的任何操作都会阻 ...

  7. android中的一些问题

    1. Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚 ...

  8. 【转】Android中的内存管理--不错不错,避免使用枚举类型

    原文网址:http://android-performance.com/android/2014/02/17/android-manage-memory.html 本文内容翻译自:http://dev ...

  9. Android中的数据存储

    Android中的数据存储主要分为三种基本方法: 1.利用shared preferences存储一些轻量级的键值对数据. 2.传统文件系统. 3.利用SQLite的数据库管理系统. 对SharedP ...

随机推荐

  1. 一看就懂得移动端rem布局、rem如何换算

    这里使用了js控制根元素的font-size大小,然后进行rem换算,在js代码后面会说明以下问题. 1.如何进行rem运算? 2.如果纯js控制根元素用rem布局会出现的小问题,如何解决? 3.如有 ...

  2. WebService基本概念及原理

    一.Web Service基本概念 WebService是一种跨编程语言和跨操作系统平台的远程调用技术.Web Service也叫XML Web Service WebService是一种可以接收从I ...

  3. java中的static使用--静态变量、静态方法

    Java 中的 static 使用之静态变量 大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 s ...

  4. JVM内存模型和性能优化

    JVM内存模型优点 内置基于内存的并发模型:      多线程机制 同步锁Synchronization 大量线程安全型库包支持 基于内存的并发机制,粒度灵活控制,灵活度高于数据库锁. 多核并行计算模 ...

  5. phpstudy 出现“请自行检查是否安装VC9运行库??”问题 -- 缺少vc9库

    phpStudy是一款PHP调试环境的程序集成包,该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便.好用的 ...

  6. 清除WKWebView的缓存

    OC写法: swift写法再下下面. 清除WKWebView的缓存,让H5页面一刷新就更新至最新的页面 要区分iOS9.0和8.0两种 - (void)deleteWebCache { if ([[U ...

  7. C# 5.0新推出的async和await

    class Program { static void Main(string[] args) { Test t = new Test(); } } public class Test { publi ...

  8. AIX 查看当前目录内最大的10个目录

       du  | sort -r n| head -n10 du  查看目录大小: srot  排序,-r 选择倒序,-n选项 看作数值排序(否则将作为字符排序): herd   -n10  查看开通 ...

  9. Excel中添加并使用宏实现批量更新数据

    一.状况描述    当我们需要后台更新大量数据的时候,可以使用该功能.二.解決方案    (1)新建一个Excel文件,并另存为启用宏的Excel工作簿,扩展名为.xlsm.    (2)在Excel ...

  10. 云端卫士实战录 | Java高级特性之多线程

    <实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...