Android中的IntentService
首先说下,其他概念: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的更多相关文章
- Android中使用IntentService运行后台任务
IntentService提供了一种在后台线程中运行任务的方式,适合处理运行时间较长的后台任务. 长处: (1)IntentService执行在单独的线程中.不会堵塞UI线程 (2)IntentSer ...
- android 中IntentService的作用及使用
IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同 ...
- Android中Services之异步IntentService
IntentService:异步处理服务,新开一个线程:handlerThread在线程中发消息,然后接受处理完成后,会清理线程,并且关掉服务. IntentService有以下特点: (1) 它创 ...
- Android中IntentService与Service
Android中的Service是用于后台服务的,当应用程序被挂到后台的时候,问了保证应用某些组件仍然可以工作而引入了Service这个概念,那么这里面要强调的是Service不是独立的进程,也不是独 ...
- Android中Service(服务)详解
http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...
- 在Android中使用并发来提高速度和性能
Android框架提供了很实用的异步处理类.然而它们中的大多数在一个单一的后台线程中排队.当你需要多个线程时你是怎么做的? 众所周知,UI更新发生在UI线程(也称为主线程).在主线程中的任何操作都会阻 ...
- android中的一些问题
1. Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚 ...
- 【转】Android中的内存管理--不错不错,避免使用枚举类型
原文网址:http://android-performance.com/android/2014/02/17/android-manage-memory.html 本文内容翻译自:http://dev ...
- Android中的数据存储
Android中的数据存储主要分为三种基本方法: 1.利用shared preferences存储一些轻量级的键值对数据. 2.传统文件系统. 3.利用SQLite的数据库管理系统. 对SharedP ...
随机推荐
- 转发(forward)和重定向(sendRedirect)
一. RequestDispatche 是一个Web资源的包装器,可以用来把当前的Request传递给该资源,或者把新的资源包括到当前的相应中.详细来说:RequestDispatch对象从客户端获取 ...
- sqlite的简介
第一步: 第二步,建立桥接文件 随便创建一个类,语言选择oc,然后它会问你是否创建桥接模式,然后你选择是就可以了 那个类可以删除了 在那份桥接文件中加入一句话#import <sqlite3.h ...
- C# 科学计数法转换成数字
/// <summary> /// 判断输入的数是否是科学计数法.如果是的话,就会将其换算成整数并且返回,否则就返回false. /// </summary> /// < ...
- 程序中保存状态的方式之ViewState
程序中保存状态的方式有以下几种: 1.Application 2.Cookie 3.Session 4.ViewState:ViewState是保存状态的方式之一,ViewState实际就是一个Hid ...
- SQL Server创建复合索引时,复合索引列顺序对查询的性能影响
说说复合索引 写索引的博客太多了,一直不想动手写,有一下两个原因:一是觉得有炒剩饭的嫌疑,有兄弟曾说:索引吗,只要在查询条件上建索引就行了,真的可以这么暴力吗?二来觉得,索引是个非常大的话题,很难概括 ...
- linux 开机自添加路由
进入 vi /etc/sysconfig/network/routes Destination Gateway Genmask Use Iface172. ...
- sql server 触发器应用 insert
--添加自定义错误码提示,要求先有英文版才能有中文版 EXEC sp_addmessage ,,@msgtext='Violation of the table unique constraint', ...
- SQL 存储过程优化经验
经现场同事反映,他们用的好好的XML 导出工具最近一直报错,经常报数据库连接超时,查看数据库发现已经有100G 以上有空间了. 但导出数据的存储过程里面每次按时间只导1000多条数据,近理说有时间过滤 ...
- mount: unknown filesystem type 'ntfs'
mount: unknown filesystem type 'ntfs' 问题描述 # mount –t ntfs /dev/sdc1 /mnt/usb2 mount: unknown filesy ...
- .net mvc 扩展IPrincipal接口
.自定义实现IPrincipal接口的类 interface ICustomPrincipal : IPrincipal { string Identifier { get; set; } strin ...