IntentService精要點總結

1.Service不是一個單獨的進程 ,它和應用程序在同一個進程中
2.Service不是一個線程,所以我們應該避免在Service裏面進行耗時的操作

由於服務進程的優先級高於後臺進程, 因此如果activity需要執行耗時操作, 最好還是啓動一個service來完成. 當然, 在activity中啓動子線程完成耗時操作也可以,但是這樣做的缺點在於,一旦activity不再可見,activity所在的進程成爲後臺進程, 而內存不足時後臺進程隨時都有可能被系統殺死(但是啓動service完成耗時操作會帶來數據交互的問題, 比如耗時操作需要實時更新UI控件的狀態的話,service就不是一個好的選擇,此時可以通過廣播進行實時更新UI狀態,類似慕課網的下載實時更新進度條的實現)。

基於同樣的考慮, 在BroadcastReceiver中也不應該執行耗時操作, 而應該啓動service來完成(當然, BroadcastReceiver的生命週期過於短暫, 也決定了不能在其中執行耗時操作)。

IntentService使用隊列的方式將請求的Intent加入隊列,然後開啓一個worker thread(線程)來處理隊列中的Intent,對於異步的startService請求,IntentService會處理完成一個之後再處理第二個,每一個請求都會在一個單獨的worker thread中處理,不會阻塞應用程序的主線程。
IntentService是一個通過Context.startService(Intent)啓動可以處理異步請求的Service,使用時你只需要繼承IntentService和重寫其中的onHandleIntent(Intent)方法接收一個Intent對象,在適當的時候會停止自己(一般在工作完成的時候)。所有的請求的處理都在一個工作線程中完成,它們會依次執行(但不會阻塞主線程的執行),一次只能執行一個請求(單工作線程執行)。
這是一個基於消息的服務,每次啓動該服務並不是馬上處理你的工作,而是首先會創建對應的Looper,Handler並且在MessageQueue中添加的附帶客戶Intent的Message對象,當Looper發現有Message的時候接着得到Intent對象通過在onHandleIntent((Intent)msg.obj)中調用你的處理程序,處理完後即會停止自己的服務,意思是Intent的生命週期跟你的處理的任務是一致的,所以這個類用下載任務中非常好,下載任務結束後服務自身就會結束退出。
總結IntentService的特徵有:
(1)會創建獨立的worker線程來處理所有的Intent請求;
(2)會創建獨立的worker線程來處理onHandleIntent()方法實現的代碼,無需處理多線程問題;
(3)所有請求處理完成後,IntentService會自動停止,無需調用stopSelf()方法停止Service;

可以啓動IntentService多次,而每一個耗時操作會以工作隊列的方式在IntentService的onHandleIntent回調方法中執行,並且,每次只會執行一個工作線程,執行完第一個再執行第二個,以此類推。所有請求都在一個單線程中,不會阻塞應用程序的主線程(UI Thread),同一時間只處理一個請求。
好處: 1、不需要開啓線程 2、不需要關閉服務,它自己關閉 3、單線程下載數據 4、it’s so easy to use!

IntentService 實際上是Looper,Handler,Service 的集合體,他不僅有服務的功能,還有處理和循環消息的功能.

更多資料參考:這裏寫鏈接內容

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