首先说下,其他概念: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
最后,感谢上述链接的作者!并欢迎大家指正