概述
IntentService继承了Service并且是一个抽象类,使用它必须创建它的子类。IntentService可执行后台耗时的任务,当任务结束时它会自动停止。由于IntentService是一种服务,所以它的优先级会比普通线程的高,适合执行一些高优先级的后台任务,因为高优先级不容易被系统杀死。
工作原理
IntentService封装了HandlerThread和Handler,在onCreate方法中创建HandlerThread和Handler,并把handler和HandlerThread的Looper关联起来
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
每一次启动IntentService,onStartCommand方法会被调用,处理每个后台任务的Intent.
public int onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
上面代码可以知道,onStartCommand又调用了onStart(intent, startId)
public void onStart(Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
onStart方法通过mServiceHandler把Intent对象发送出去,这个Intent对象跟外界的startService(intent)中的intent是一致的
我们看看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);
}
}
handleMessage方法调用了onHandleIntent((Intent)msg.obj)。onHandleIntent是个抽象方法,我们需要在IntentService的子类重写它,所以在这里我们可以进行耗时任务的执行。通过不同的intent参数,我们就可以进行不同的后台任务处理了。onHandleIntent方法执行完毕后调用stopSelf(int startId)自动停止任务,之所以调用stopSelf(int startId)而不是stopSelf(),是因为stopSelf()会马上停止任务,但这时可能会有其他任务还没处理,stopSelf(int startId)会等待所有任务处理之后再停止任务。
由于IntentService内部是通过handler的形式发送消息处理任务的,Looepr是按顺序处理消息的,所以IntentService也是按启动顺序执行后台任务。
通过以上的分析,我们知道IntentService的使用重点在于重写onHandleIntent方法,对不同的intent对象进行不同的处理,启动IntentService时对intent传入参数,通过这些参数作为标识就可以进行不同任务的处理