Android之路

导航

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

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

 

posted on 2016-11-13 16:09  Android之路  阅读(448)  评论(0编辑  收藏  举报