目錄
1、IntentServic是什麼及作用
2、IntentService的架構
3、IntentService源碼分析
4、FutureTask是什麼
5、FutureTask源碼分析
1、IntentServic是什麼及作用
IntentService是一個特殊的service。
特殊兩點:
(1)在其運行過程中會自動開啓子線程中執行耗時任務;
(2)所有任務執行完成之後會自動停止。
2、IntentService的架構
IntentService底層需要HandlerThread和handler做支撐
3、IntentService源碼分析
HandlerThread是一個可以構造handler的thread,在其run方法中使用 Looper.prepare();向當前線程添加了一個looper,然後調用Looper.loop(); 開啓消息循環。
在IntentService的onCreate方法中構造了一個HandlerThread,並獲取這個HandlerThread中的looper,構造了一個ServiceHandler,在IntentService的onStart方法中通過在oncreate方法中構造的ServiceHandler將啓動IntentService的intent進行包裝之後發送到HandlerThread中進行處理,這樣處理的流程就切換到子線程中,在ServiceHandler的handleMessage中首先調用了onHandleIntent方法執行耗時任務,然後調用了stopSelf等待所有任務完成之後就關閉自己。
startId:A unique integer representing this specific request to start
表示此特定啓動請求的唯一整數
stopSelf(int startId):
在其參數startId跟最後啓動該service時生成的ID相等時纔會執行停止服務。
stopSelf():直接停止服務。
使用場景:
如果同時有多個服務啓動請求發送到onStartCommand(),不應該在處理完一個請求後調用stopSelf();因爲在調用此函數銷燬service之前,可能service又接收到新的啓動請求,如果此時service被銷燬,新的請求將得不到處理。此情況應該調用stopSelf(int startId)。請參見:IntentService
public void onDestroy() {
mServiceLooper.quit();
}
stopSelf service之後會回到其onDestroy方法,在onDestroy方法中調用mServiceLooper.quit去清除構造它的隊列中的所有消息,所有停止服務後,後續消息不能執行。