為什么需要有IntentService:
Android中的IntentService是繼承自Service類的,在我們討論IntentService之前,我們先想一下Service的特點: Service的回調方法(onCreate、onStartCommand、onBind、onDestroy)都是運行在主線程中的。當我們通過startService啟動Service之后,我們就需要在Service的onStartCommand方法中寫代碼完成工作,但是onStartCommand是運行在主線程中的,如果我們需要在此處完成一些網絡請求或IO等耗時操作,這樣就會阻塞主線程UI無響應,從而出現ANR現象。為了解決這種問題,最好的辦法就是在onStartCommand中創建一個新的線程,并把耗時代碼放到這個新線程中執行。在onStartCommand中開啟了新的線程作為工作線程去執行網絡請求,這樣不會阻塞主線程。由此看來,創建一個帶有工作線程的Service是一種很常見的需求(因為工作線程不會阻塞主線程),所以Android為了簡化開發帶有工作線程的Service,Android額外開發了一個類——–IntentService。
IntentService的特點:
IntentService具有以下特點:
- IntentService自帶一個工作線程,當我們的Service需要做一些可能會阻塞主線程的工作的時候可以考慮使用IntentService。
- 我們需要將要做的實際工作放入到IntentService的onHandleIntent回到方法中,當我們通過startService(intent)啟動了IntentService之后,最終Android Framework會回調其onHandleIntent方法,并將intent傳入該方法,這樣我們就可以根據intent去做實際工作,并且onHandleIntent運行在IntentService所持有的工作線程中,而非主線程。
- 當我們通過startService多次啟動了IntentService,這會產生多個job,由于IntentService只持有一個工作線程,所以每次onHandleIntent只能處理一個job。面多多個job,IntentService會如何處理?處理方式是one-by-one,也就是一個一個按照先后順序處理,先將intent1傳入onHandleIntent,讓其完成job1,然后將intent2傳入onHandleIntent,讓其完成job2…這樣直至所有job完成,所以我們IntentService不能并行的執行多個job,只能一個一個的按照先后順序完成,當所有job完成的時候IntentService就銷毀了,會執行onDestroy回調方法。