Android IntentService 源码解析
Service作为Android四大组件之一在项目开发中至关重要,一些耗时的业务都会用到Service,但是因为Service是在主线程当中的,所以要想在Service中做一些耗时的操作必须要自己创建Thread,还好Android提供了另外一个类就是我们要讲的IntentService,IntentService是Service的子类,下面就让我们通过源码来看看它内部的实现,我们先来看看它的onCreate方法。
onCreate方法
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);
}
首先创建了一个HandlerThread,不了解HandlerThread的可以看看这篇文章(http://www.jianshu.com/p/d1e0bb996601)
启动线程,创建ServiceHandler,通过onCreate方法可以看出它内部封装了一个
Handler,Looper,Thread的消息处理逻辑。
onStart方法
public void onStart(Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
通过mServiceHandler发送了一条消息,然后回到handleMessage执行逻辑
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
onHandleIntent就是我们要重写的方法,这里处理我们的业务逻辑,stopSelf方法销毁IntentService,如果这条消息是最后一条消息就销毁,否则不销毁,我们通过代码来验证下
public class TestService extends IntentService {
public static final String TAG = "TestService";
public TestService() {
super("st");
}
@Override
protected void onHandleIntent(Intent intent) {
}
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "onStartCommand:" + startId);
return super.onStartCommand(intent, flags,startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy");
}
}
通过startService启动
startService(new Intent(EleActivity.this, TestService.class));
我们来看看打印结果
01-24 13:42:53.597 3172-3172/com.fear I/TestService: onCreate
01-24 13:42:53.598 3172-3172/com.fear I/TestService: onStartCommand:1
01-24 13:42:53.600 3172-3172/com.fear I/TestService: onDestroy
我们调用了onStartCommand方法一次发送一条消息,消息处理完销毁自己。
那我们发送5条消息会是什么有样子呢?
for(int i = 0; i < 5; i++)
{
startService(new Intent(EleActivity.this, TestService.class));
}
因为IntentService的onCreate只会调用一次,如果启动5次是会调用5次onStartCommand方法,我们来看看打印结果
01-24 13:45:02.535 6363-6363/com.fear I/TestService: onCreate
01-24 13:45:02.536 6363-6363/com.fear I/TestService: onStartCommand:1
01-24 13:45:02.536 6363-6363/com.fear I/TestService: onStartCommand:2
01-24 13:45:02.536 6363-6363/com.fear I/TestService: onStartCommand:3
01-24 13:45:02.537 6363-6363/com.fear I/TestService: onStartCommand:4
01-24 13:45:02.537 6363-6363/com.fear I/TestService: onStartCommand:5
01-24 13:45:02.542 6363-6363/com.fear I/TestService: onDestroy
可以看到调用了5次onStartCommand,发送了5条消息,消息都处理完,然后销毁自己。
总结
IntentService是Service子类,重写了onCreate方法和onStart方法,内部封装了Handler,Looper,Thread来处理消息,开发者可以通过复写onHandleIntent来处理自己的业务逻辑。