android线程--IntentService

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~

你可能感兴趣的:(android线程--IntentService)