IntentService解析

Posted by alonealice on 2016-08-04

IntentService是Service的子类,它只要是处理异步请求。与普通的Service相比,它有两点区别:一是它的操作都是在异步线程中进行,二是它执行完成之后会自动停止。那我们就来看看它内部是如何实现的。
IntentService的源码真的是非常简单,只有区区几十行代码。
首先来看看oncreate方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
public void onCreate() {
// TODO: It would be nice to have an option to hold a partial wakelock
// during processing, and to have a static startService(Context, Intent)
// method that would launch the service & hand off a wakelock.

super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();

mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}

首先它会创建一个HandlerThreadHandlerThread继承自Thread,它内部会获取到一个自己的Looper。然后再用该Thread的looper创建Handler。
再来看看onStartCommand方法:

1
2
3
4
5
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}

这里主要是执行了onStart方法,那再看看onStart方法:

1
2
3
4
5
6
7
@Override
public void onStart(Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}

onStart方法主要就是将传递过来的Intent,作为message传递给ServiceHandler,这样每个操作就会在ServiceHandler中以工作队列的方式依次执行。那再来看看ServiceHandler的具体实现。

1
2
3
4
5
6
7
8
9
10
11
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);
}
}

ServiceHandler在实现时,一是执行onHandleIntent方法,这个方法需要我们实现并做具体的逻辑操作,然后停止该IntentService。
最后在Service被销毁时经looper的任务销毁。

1
2
3
4
@Override
public void onDestroy() {
mServiceLooper.quit();
}

全部代码几乎都在这里了。最后再来理一下整个流程:首先创建时会创建一个线程,在通过该线程创建Handler,然后将任务添加到添加到该Handler中,在过程中每次创建时都会讲任务添加到Handler的任务队列,执行完成之后就会将服务停止。