面試專題(十三):Service 與 IntentService

1.Service 與 IntentService區別:

  • Service不是運行在獨立的線程,所以不建議在Service中編寫耗時的邏輯和操作,否則會引起ANR。

  • IntentService

    1.可用於執行後臺耗時的任務,任務執行後會自動停止。

    2.具有高優先級,適合高優先級的後臺任務,且不容易被系統殺死。

    3.可以多次啓動,每個耗時操作都會以工作隊列的方式在IntentService的onHandleIntent回調方法中執行。

2.IntentService的使用:

在這裏插入圖片描述

3.源碼角度看一看

然後我們再來看看源碼是怎麼實現的:

  • 第一:

    在IntentService的onCreate()中我們可以看到:

    首先是創建了一個HandlerThread線程,然後啓動線程。

    然後再通過這個線程裏的Looper創建了一個Handler。

    所以這個ServiceHandler是在子線程中執行的。【所以IntentService可用於執行後臺耗時的任務】
    在這裏插入圖片描述

  • 第二:

    在onStart()的時候會通過這個Handler去發送消息;

    緊接着就會進入Handler的handleMessage()方法,

    而這裏面就有我們重寫的onHandleIntent()方法。

    並且在onHandleIntent()執行完以後會執行stopSelf().【所以任務執行後IntentService可以自動停止】
    在這裏插入圖片描述
    在這裏插入圖片描述

  • 第三:

    IntentService是具有高優先級的,不容易被系統殺死,那這個高優先級肯定是由線程決定的,

    我們可以看到Thread在創建的時候設置的優先級爲0,非常的高。
    在這裏插入圖片描述

  • 第四:

    爲什麼每個耗時操作都會以工作隊列的方式在回調方法中執行?

    因爲onHandleIntent()實際上就是在Handler中執行的,而我們的Handler就是一個消息隊列(底層是單鏈表)。

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