IntentService和Service區別

  • 作者:由 匿名使用者 發表于 動漫
  • 2022-12-12

IntentService和Service區別溫嶼17 2022-06-08

1、基本概念

Android中的Service是用於後臺服務的,當應用程式被掛到後臺的時候,問了保證應用某些元件仍然可以工作而引入了Service這個概念,那麼這裡面要強調的是Service不是獨立的程序,也不是獨立的執行緒,它是依賴於應用程式的主執行緒的,也就是說,在更多時候不建議在Service中編寫耗時的邏輯和操作(主執行緒耗時操作),否則會引起ANR。

那麼我們當我們編寫的耗時邏輯,不得不被service來管理的時候,就需要引入IntentService,IntentService是繼承Service的,那麼它包含了Service的全部特性,當然也包含service的生命週期,那麼與service不同的是,IntentService在執行onCreate操作的時候,內部開了一個執行緒,去執行你的耗時操作。

1、Service

Service 是長期執行在後臺的應用程式元件。

Service 不是一個單獨的程序,它和應用程式在同一個程序中,Service 也不是一個執行緒,它和執行緒沒有任何關係,所以它不能直接處理耗時操作。如果直接把耗時操作放在 Service 的 onStartCommand() 中,很容易引起 ANR 。如果有耗時操作就必須開啟一個單獨的執行緒來處理。

2、IntentService

IntentService 是繼承於 Service 並處理非同步請求的一個類,在 IntentService 內有一個工作執行緒來處理耗時操作,啟動 IntentService 的方式和啟動傳統 Service 一樣,同時,當任務執行完後,IntentService 會自動停止,而不需要我們去手動控制。另外,可以啟動 IntentService 多次,而每一個耗時操作會以工作佇列的方式在IntentService 的 onHandleIntent 回撥方法中執行,並且,每次只會執行一個工作執行緒,執行完第一個再執行第二個,以此類推。(序列執行)

而且,所有請求都在一個單執行緒中,不會阻塞應用程式的主執行緒(UI Thread),同一時間只處理一個請求。 那麼,用 IntentService 有什麼好處呢?首先,第一,我們省去了在 Service 中手動開執行緒執行耗時操作的麻煩,第二,當操作完成時,我們不用手動停止 Service。

2、實現原理

IntentService本質是採用Handler & HandlerThread方式:

透過HandlerThread單獨開啟一個名為IntentService的執行緒

建立一個名叫ServiceHandler的內部Handler

把內部Handler與HandlerThread所對應的子執行緒進行繫結

透過onStartCommand()傳遞給服務intent,依次插入到工作佇列中,並逐個傳送給onHandleIntent()

透過onHandleIntent()來依次處理所有Intent請求物件所對應的任務

Top