IntentService
默認的Service是執行在主線程的,可是通常情況下,這很容易影響到程序的繪製性能(搶佔了主線程的資源)。除了前面介紹過的AsyncTask與HandlerThread,我們還可以選擇使用IntentService來實現異步操作。IntentService繼承自普通Service同時又在內部創建了一個HandlerThread,在onHandlerIntent()
的回調裡面處理扔到IntentService的任務。所以IntentService就不僅僅具備了異步線程的特性,還同時保留了Service不受主頁面生命週期影響的特點。
如此一來,我們可以在IntentService裡面通過設置鬧鐘間隔性的觸發異步任務,例如刷新數據,更新緩存的圖片或者是分析用戶操作行為等等,當然處理這些任務需要小心謹慎。
使用IntentService需要特別留意以下幾點:
- 首先,因為IntentService內置的是HandlerThread作為異步線程,所以每一個交給IntentService的任務都將以隊列的方式逐個被執行到,一旦隊列中有某個任務執行時間過長,那麼就會導致後續的任務都會被延遲處理。
- 其次,通常使用到IntentService的時候,我們會結合使用BroadcastReceiver把工作線程的任務執行結果返回給主UI線程。使用廣播容易引起性能問題,我們可以使用LocalBroadcastManager來發送只在程序內部傳遞的廣播,從而提升廣播的性能。我們也可以使用
runOnUiThread()
快速回調到主UI線程。 - 最後,包含正在運行的IntentService的程序相比起純粹的後台程序更不容易被系統殺死,該程序的優先級是介於前台程序與純後台程序之間的。