閱讀此文前請先閱讀對HandlerThread的理解,有助于理解IntentService蚣常。
概述
IntentService繼承了Service并且是一個抽象類饥侵,使用它必須創(chuàng)建它的子類。IntentService可執(zhí)行后臺耗時的任務哩簿,當任務結束時它會自動停止宵蕉。由于IntentService是一種服務,所以它的優(yōu)先級會比普通線程的高卡骂,適合執(zhí)行一些高優(yōu)先級的后臺任務国裳,因為高優(yōu)先級不容易被系統(tǒng)殺死。
工作原理
IntentService封裝了HandlerThread和Handler,在onCreate方法中創(chuàng)建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對象發(fā)送出去渺杉,這個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的子類重寫它是越,所以在這里我們可以進行耗時任務的執(zhí)行耳舅。通過不同的intent參數,我們就可以進行不同的后臺任務處理了倚评。onHandleIntent方法執(zhí)行完畢后調用stopSelf(int startId)自動停止任務浦徊,之所以調用stopSelf(int startId)而不是stopSelf(),是因為stopSelf()會馬上停止任務天梧,但這時可能會有其他任務還沒處理盔性,stopSelf(int startId)會等待所有任務處理之后再停止任務。
由于IntentService內部是通過handler的形式發(fā)送消息處理任務的呢岗,Looepr是按順序處理消息的冕香,所以IntentService也是按啟動順序執(zhí)行后臺任務。
通過以上的分析后豫,我們知道IntentService的使用重點在于重寫onHandleIntent方法悉尾,對不同的intent對象進行不同的處理,啟動IntentService時對intent傳入參數挫酿,通過這些參數作為標識就可以進行不同任務的處理