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,開發人員必備技能——單元測試