IntentService的源代码分析路径如下:
onCreate( ) -> onStartCommand(Intent , int ) -> onStart(Intent ,int ) ->(内部类)ServiceHandler.handleMessage(Message ) -> onHandleIntent(Intent) ->stopSelf(Int)
一.
我们看onCreate()构造方法:
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
我们看到,在构造器中做了以下一些准备工作:
1. 创建一个HandlerThread ,并启动
2. 由HandlerThread实例中获得一个Looper
3. 将2中获得的looper作为参数传进内部类ServiceHandler的构造方法中构造一个ServiceHandler
二.
每次启动IntentService就会调用一次onStartCommand(Intent ,Int),然后它紧接着就调用了onStart(Intent ,Int),我们来看一下onStart(Intent, Int):
public void onStart(Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
明显看到在onStart中做了以下工作:
1.创建一个Message对象
2.将onStart的参数传进message对象中
3.调用内部类ServiceHandler的sendMessage方法发送消息,这会使得ServiceHandler接受到消息后调用handleMessage(Message);
三.
我们接下来看看内部类ServiceHandler的内容是什么:
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中有一个ServiceHandler的内部类,在内部类的handleMessage 方法中,onHandleIntent(Intent)被调用,而这个onHandleIntent(Intent)是一个抽象方法,它由IntentService的子类提供实现;
而真正的任务的执行就是发生在这个由子类实现的onHandleIntent(Intent)方法里;
在任务结束后,handleMessage(Message)会调用stopSelf来停止自身(IntentService);
这样一个IntentService就完成它的任务了。