IntentService是一种特殊的Service,它继承了Service并是他的一个抽象类,因此必须创建他的子类才能够使用IntentService。IntentService可用于执行后台耗时的操作,当任务执行完,他会自动停止。
@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);
}
onCreate分析如下:
创建一个HandlerThread,然后使用它的Looper来构建一个Hander对象ServiceHandler,这样通过mServiceHandler发送的消息最终都会在HandlerThread中执行。每次启动IntentService都会调用一次onStartCommand,而onStartCommand会调用onStart,他的代码如下:
@Override
public void onStart(Intent intent, int startId){
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
可以看出,IntentService仅仅是通过mServiceThread发送了一个消息,这个消息会在HandlerThread中被处理。mServiceHandler接收到消息以后,会将Intent的对象传递给onIntentThread方法去处理。这个Intent对象的内容和外界的startService(intent)中的intnet的内容是完全一致的,通过这个intent即可解析出外界启动的IntentService方法时所传递的参数,然后可以区分具体的后台任务。IntentService中的ServieHandler的带阿门如下:
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后,IntentService会调用stopSelf(int startId)来尝试停止服务。为什么不直接用stopSelf()呢?
因为stopSelf()会立刻停止服务,这个时候还有可能有其他消息未处理,而stopSelf(int startId)会等待所有的消息都处理完毕后才会终止服务。一般来说,stopSelf(int startId)会在停止之前判断最近启动服务的次数是否和startId相等,相等则停止,不等就等待。over~