Android IntentService詳解

爲什麼需要有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具有以下特點:

  1. IntentService自帶一個工作線程,當我們的Service需要做一些可能會阻塞主線程的工作的時候可以考慮使用IntentService。
  2. 我們需要將要做的實際工作放入到IntentService的onHandleIntent回到方法中,當我們通過startService(intent)啓動了IntentService之後,最終Android Framework會回調其onHandleIntent方法,並將intent傳入該方法,這樣我們就可以根據intent去做實際工作,並且onHandleIntent運行在IntentService所持有的工作線程中,而非主線程。
  3. 當我們通過startService多次啓動了IntentService,這會產生多個job,由於IntentService只持有一個工作線程,所以每次onHandleIntent只能處理一個job。面多多個job,IntentService會如何處理?處理方式是one-by-one,也就是一個一個按照先後順序處理,先將intent1傳入onHandleIntent,讓其完成job1,然後將intent2傳入onHandleIntent,讓其完成job2…這樣直至所有job完成,所以我們IntentService不能並行的執行多個job,只能一個一個的按照先後順序完成,當所有job完成的時候IntentService就銷燬了,會執行onDestroy回調方法。



作者:鄭在學_blog
鏈接:https://www.jianshu.com/p/b49a7f58bb1f
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章