1:SystemUI服務的啓動
Android內核啓動後,會加載天字第一號(進程號1)進程init,在init進程會調用到SystemServer進程,之後該進程main方法中會調用到initAndLoop方法,在該方法中會初始化android系統需要的所有服務,SystemUI進程的服務SystemUIService也在其中加載,代碼如下:
此處爲將狀態欄服務添加至ServiceManager中,其中StatusBarManagerService爲繼承IStatusBarService.stub類,IStatusBarService中實現了registerStatusBar方法將IStatusBar對象添加至方法參數中供系統調用SystemUI應用使用。
接下來還是在initAndLoop方法中調用startServiceUI(contextF)方法來實現調用進行SystemUI中的SystemUIService服務,如下:
該方法通過包名類名啓動SystemUIService,接下來在該服務中的onCreate()做如下調用:
接着調用Application的startServicesIfNeeded(),在該方法中會遍歷所有的子服務(繼承SystemUi抽象類),調用這些服務的start()方法,如下:
其中的子服務如下:
關於狀態欄導航欄的服務是SystemBar類,調用該類的start方法後,會創建ServiceMonitor對象,並調用該類的start方法,如下:
接着在該start方法會回調給SystemBar方法的onNoService方法中去,在該方法中會調用CreateStatusBarFormConfig方法,如下:
該方法採用類加載器得到PhoneStatusBar對象,並調用其start方法,然後再該類的start方法中會調用到BaseStatusBar中的start方法,改方法會註冊狀態欄服務的回調和調用CreateAndAddWindows()方法實現狀態欄和導航欄窗口的添加,如下:
註冊狀態欄服務回調:
CreateAndAddWindows()最終加載window的代碼如下:
此處爲添加狀態欄,接下來是添加導航欄:
至此導航欄的與狀態欄添加完成,至於子view的邏輯和UI的加載下一篇文章講解。