Android Service学习之IntentService 深入分析

什么是IntentService? (本文转自http://blog.csdn.net/gaojie314/archive/2010/11/28/6040701.aspx

官方的解释是:

IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) on demand. Clients send requests through android.content.Context.startService(Intent) calls; the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work.
This "work queue processor" pattern is commonly used to offload tasks from an application‘s main thread. The IntentService class exists to simplify this pattern and take care of the mechanics. To use it, extend IntentService and implement onHandleIntent(Intent). IntentService will receive the Intents, launch a worker thread, and stop the service as appropriate.
All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application‘s main loop), but only one request will be processed at a time.

意思是说:IntentService是一个通过Context.startService(Intent)启动可以处理异步请求的Service,使用时你只需要继承IntentService和重写其中的onHandleIntent(Intent)方法接收一个Intent对象,在适当的时候会停止自己(一般在工作完成的时候). 所有的请求的处理都在一个工作线程中完成,它们会交替执行(但不会阻塞主线程的执行),一次只能执行一个请求.(**本人修改了原文的一些翻译)

下面是要分析的源码:

public abstract class IntentService extends Service {
        private volatile Looper mServiceLooper;         private volatile ServiceHandler mServiceHandler;
        private String mName;         private boolean mRedelivery;    
        private final class ServiceHandler extends Handler {
                public ServiceHandler(Looper looper) {                         super(looper);                 }                     @Override                 public void handleMessage(Message msg) {                         onHandleIntent((Intent)msg.obj);                         stopSelf(msg.arg1);                 }
        }

从源码可以分析出: IntentService 实际上是Looper,Handler,Service 的集合体,他不仅有服务的功能,还有处理和循环消息的功能.
下面是onCreate()的源码:

@Override         public void onCreate() {                 super.onCreate();
                HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");                 thread.start();
                mServiceLooper = thread.getLooper();                 mServiceHandler = new ServiceHandler(mServiceLooper);         }

分析:IntentService创建时就会创建Handler线程(HandlerThread)并且启动,然后再得到当前线程的Looper对象来初始化IntentService的mServiceLooper,接着创建mServicehandler对象.

下面是onStart()的源码:

@Override         public void onStart(Intent intent, int startId) {                 Message msg = mServiceHandler.obtainMessage();                 msg.arg1 = startId;                 msg.obj = intent;
                mServiceHandler.sendMessage(msg);         }

分析:当你启动IntentService的时候,就会产生一条附带startId和Intent的Message并发送到MessageQueue中,接下来Looper发现MessageQueue中有Message的时候,就会停止Handler处理消息,接下来处理的代码如下:

@Override         public void handleMessage(Message msg) {                         onHandleIntent((Intent)msg.obj);                         stopSelf(msg.arg1);         }

接着调用 onHandleIntent((Intent)msg.obj),这是一个抽象的方法,其实就是我们要重写实现的方法,我们可以在这个方法里面处理我们的工作.当任务完成时就会调用stopSelf(msg.arg1)这个方法来结束指定的工作.

当所有的工作执行完后:就会执行onDestroy方法,源码如下:

@Override         public void onDestroy() {                 mServiceLooper.quit();         }

服务结束后调用这个方法 mServiceLooper.quit()使looper停下来.
通过对源码的分析得出:     这是一个基于消息的服务,每次启动该服务并不是马上处理你的工作,而是首先会创建对应的Looper,Handler并且在MessageQueue中添加的附带客户Intent的Message对象,当Looper发现有Message的时候接着得到Intent对象通过在onHandleIntent((Intent)msg.obj)中调用你的处理程序.处理完后即会停止自己的服务.意思是Intent的生命周期跟你的处理的任务是一致的.所以这个类用下载任务中非常好,下载任务结束后服务自身就会结束退出

时间: 2024-08-12 10:15:22

Android Service学习之IntentService 深入分析的相关文章

【转】android service 之二(IntentService)

原文网址:http://rainbow702.iteye.com/blog/1143286 不管是何种Service,它默认都是在应用程序的主线程(亦即UI线程)中运行的.所以,如果你的Service将要运行非常耗时或者可能被阻塞的操作时,你的应用程序将会被挂起,甚至会出现ANR错误.为了避免这一问题,你应该在Service中重新启动一个新的线程来进行这些操作.现有两种方法共大家参考: ① 直接在Service的onStartCommand()方法中重启一个线程来执行,如: Java代码   @

android Service学习笔记

服务简介 Service在继承关系上是Activity的大爷,也就是说Activity多继承了一个类,封装了界面相关,等等其他操作. 服务没有onPause.onStop.onResume.onRestart方法,因为service没有界面,长期运行在后台. startService方式启动服务 Start方式启动服务声明周期: 服务被创建时依次调用onCreate.onStartCommand: 同一个服务只能被创建一次(onCreate),再次创建就只会执行onStartCommand: 一

Android Service学习

AndroidManifest.xml 注册service <service android:name=".service.myService" android:enabled="true" > <intent-filter> <action android:name="com.test.service" /> </intent-filter> </service> Activity中启

Android Service学习之本地服务

Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个Service必须在manifest中 通过来声明.可以通过contect.startservice和contect.bindserverice来启动. Service和其他的应用组件一样,运行在进程的主线程中.这就是说如果service需要很多耗时或者阻塞的操作,需要在其子线程中实现. service的两种模式(startService()/bindService()不是完全分离的): 本地服务 Local Service

Android Service学习之AIDL, Parcelable和远程服务

AIDL的作用 由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象.在Android平台,一个进程通常不能访问另一个进程的内存空间,所以要想对话,需要将对象分解成操作系统可以理解的基本单元,并且有序的通过进程边界.    通过代码来实现这个数据传输过程是冗长乏味的,Android提供了AIDL工具来处理这项工作. AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可

Android Animation学习笔记

关于动画的实现,Android提供了Animation,在Android SDK介绍了2种Animation模式: 1. Tween Animation:通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果,即是一种渐变动画: 2. Frame Animation:顺序播放事先做好的图像,是一种画面转换动画. 动画类型 下面先来看看Android提供的动画类型.Android的animation由四种类型组成 在XML文件中: alpha        渐变透明度动画效果 scale

Android Service 服务(一)—— Service

一. Service简单介绍 Service是android 系统中的四大组件之中的一个(Activity.Service.BroadcastReceiver.ContentProvider),它跟Activity的级别差点儿相同,但不能自己执行仅仅能后台执行,而且能够和其它组件进行交互.service能够在非常多场合的应用中使用,比方播放多媒体的时候用户启动了其它Activity这个时候程序要在后台继续播放,比方检測SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务总是藏在

Android Web Service学习总结(一)

最近学习android平台调用webWebService,学习了一篇不错的博客(http://blog.csdn.net/lyq8479/article/details/6428288),可惜是2011年时的方法,而不适合现在android4.0之后的android版本,所以通过一番学习和研究,总结如下. web Service简介 通俗的理解:通过使用WebService,我们能够像调用本地方法一样去调用远程服务器上的方法.我们并不需要关心远程的那个方法是Java写的,还是PHP或C#写的:我

Android Web Service学习总结(二)

上篇文章做好了准备工作,现在就实践(android平台调用web service实现号码归属地查询) 1.    Ksoap2-android简介 在Android平台调用web service需要依赖于第三方类库ksoap2,它是一个SOAP Web service客户端开发包,主要用于资源受限制的Java环境如Applets或J2ME应用程序(CLDC/ CDC/MIDP).在Android平台中我们并不会直接使用ksoap2,而是使用ksoap2 android.KSoap2 Androi