天天看點

Service啟動過程分析

Service是一種計算型元件,用于在背景執行一系列的計算任務。由于工作在背景,是以使用者是無法直接感覺到它的存在。Service元件和Activity元件略有不同,Activity元件隻有一種運作模式,即Activity處于啟動狀态,但是Service元件卻有兩種狀态:啟動狀态和綁定狀态。當Service元件處于啟動狀态時,這個時候Service内部可以做一些背景計算,并且不需要和外界有直接的互動。

Service分為兩種工作狀态,一種是啟動狀态,主要用于執行背景計算,另一張是綁定狀态,主要用于其他元件和Service的互動,需要注意的是Service的這兩種狀态是可以共存的,即Service既可以處于啟動狀态也可以同時處于綁定狀态。

Service的啟動過程從ContextWrapper的startService開始。

這裡的mBase的類型是ContextImpl,其實說到這,就得說下Activity被建立時會通過attach方法将一個ContextImpl對象關聯起來,這也就是mBase。從ContextWrapper的實作可以看出,其中大部分操作都是通過mBase來實作的,在設計模式中這是一種典型的橋接模式。

從startServiceCommon方法中可以看出,是ActivityManagerNative.getDefault()這個方法的類啟動的,其實ActivityManagerNative.getDefault()就是AMS,是通過AMS來啟動服務的行為是一個遠端過程調用。

在上面的代碼中,AMS會通過mServices這個對象來完成Service後續的啟動過程,mServices對象的類型是ActiveService,ActiveService是一個輔助AMS進行Service管理的類,包括Service的啟動、綁定和停止等。

最終是通過app.thread的scheduleCreateService方法來建立Service對象并調用onCreate,接着再通過sendServiceArgsLocked方法來調用Service的其他方法,比如onStartCommand,這兩個過程均是程序間通信,到最後是通過ApplicationThread的scheduleCreateService方法來

是通過發消息給Handler H,H會接收這個CREATE_SERVICE消息并通過handleCreateService方法來完成Service的最終啟動。

handleCreateService主要完成了如下幾件事:

通過類加載器建立Service的執行個體

建立Application對象并調用其onCreate,當然Application的建立過程隻會有一次。

接着建立ConTextImpl對象并通過Service的attach方法建立二者之間的關系。

最後調用onCreate方法,并将Service對象存儲到ActivityThreadd的一個清單中。

和Service的啟動過程一樣,Service綁定過程也是從ContextWrapper開始的。

然後會調用bindServiceCommon方法,這個方法主要完成如下兩件事情:

首先将用戶端的ServiceConnection對象轉化為ServiceDispatcher.InnerConnection對象。

接着bindServiceCommon會通過AMS來完成Service的具體綁定過程,對應于AMS的bindService方法。

最終也是調用handleBindService來處理。

最後,以借用一張流程圖來說明:

源于對掌握的Android開發基礎點進行整理,羅列下已經總結的文章,從中可以看到技術積累的過程。

1,Android系統簡介

2,ProGuard代碼混淆

3,講講Handler+Looper+MessageQueue關系

4,Android圖檔加載庫了解

5,談談Android運作時權限了解

6,EventBus初了解

7,Android 常見工具類

8,對于Fragment的一些了解

9,Android 四大元件之 " Activity "

10,Android 四大元件之" Service "

11,Android 四大元件之“ BroadcastReceiver "

12,Android 四大元件之" ContentProvider "

13,講講 Android 事件攔截機制

14,Android 動畫的了解

15,Android 生命周期和啟動模式

16,Android IPC 機制

17,View 的事件體系

18,View 的工作原理

19,了解 Window 和 WindowManager

20,Activity 啟動過程分析

21,Service 啟動過程分析

22,Android 性能優化

23,Android 消息機制

24,Android Bitmap相關

25,Android 線程和線程池

26,Android 中的 Drawable 和動畫

27,RecylerView 中的裝飾者模式

28,Android 觸摸事件機制

29,Android 事件機制應用

30,Cordova 架構的一些了解

31,有關 Android 插件化思考

32,開發人員必備技能——單元測試