Android 5.1_SystemUI的啟動流程詳細解析 具體: http://www.bubuko.com/infodetail-1137064.html
在Android系統啟動過程中,當ActivityManager這些系統服務啟動完成後,在SystemServer中會啟動SystemUIService(也就是狀态欄服務),将狀态欄服務在系統程序中長期運作。
狀态欄的代碼在Android源碼中的路徑:\frameworks\base\package\SystemUI
(1)狀态的核心類是StatuBar,這個類是一個抽象類。它的start()方法定義了狀态欄啟動時的具體步驟。
//此start()方法繼承自SystemUI。圖中PhoneStatusBar繼承了BaseStatusBar繼承了SystemUI。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(2)BaseStatusBar繼承自SystemUI,SystemUI被SystemUIService調用,SystemUIService繼承Service,是以StatuBar也是一個Service。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(3)BaseStatusBar實作了CommandQueue.Callbacks接口,同時可以發現CommandQueue繼承自 IStatusBar.Stub遠端接口,而IStatusBar.Stub接口的方法則通過CommandQueue的Callbacks接口實作,所 以說BaseStatusBar又是IStatusBar.stub遠端接口的實作類。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(4)我們說StatuBar是抽象類,那麼IStatusBar.stub接口中方法的實作該如何實作呢?很簡單,我們可以通過StatuBar的兩個子類:PhoneStatusBar和TabletStatusBar來實作。
// PhoneStatusBar:手機狀态欄操作類 TabletStatusBar:平闆狀态欄操作類
SystemUI的組成:
· Phone:StatusBar 狀态欄 + NavigationBar 導航欄
· Tablet/TV:CombinedBar(包括StatusBar、NavigationBar)
// 針對于不同的裝置,SystemUI的組成也是不一樣的
接下來,我們來看看SystemUI是如何啟動的,給出時序圖:
(1)當核心啟動完成以後,執行init --> ServiceManager --> Zygote --> SystemServer(這隻是Android啟動的一個流程,不需要糾結細節,具體細節将在以後分析)。
// 源代碼位址:./services/java/com/android/server/SystemServer.java
-----------------------------------------------------------------context.startServiceAsUser --> 調用 ContextImpl.java--------------------------------------------------------------
---------------------------------------------------------------------------------- 跳轉 startServiceCommon------------------------------------------------------------------------------------
本程式中的ActivityManagerNative.startService()完成對SystemUIService服務的啟動。
// 對于以上的代碼,隻需要簡單了解調用過程,具體不做分析
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(3)在源代碼中,我們發現其實SystemServer初始化了Android系統中的Java層服務:
// Java層的服務很多,這裡隻是列出了一部分,具體細節不用去管,以後分析
這些服務可以通過ServiceManager的addService()方法,添加到ServiceManager的管理中。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(4)我們來跟蹤SystemUIService,觀察onCreate()方法
· onCreate() ----> 預設啟動PhoneStatusBar -->調用start()方法
// startServicesIfNeeded() ---> 調用SystemUIApplication.java --->啟動衆多子線程(服務)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(5)我們跟蹤PhoneStatusBar中的super.start()方法,進入其父類中:
· 調用start()的方法 ----> 調用super.start() ----> BaseStatusBar.java類
// 将狀态欄的具體啟動步驟交給父類的start()處理 --> 由BaseStatusBar.java類處理
// 至于狀态欄的操作則交給對應的狀态欄實作類來實作
(6)跟蹤super.start()進入BaseStatusBar.java中,分析start()方法:
//下面的程式是PhoneStatusBar.java的截圖
start() ---> createAndAddWindows() ---> makeStatusBarView --> PhoneStatusBar.java
// makeStatusBarView為抽象方法,由子類PhoneStatusBar實作
下面我們回到PhoneStatusBar中觀察程式:
我們可以發現它的傳回的對象是PhoneStatusBarView,而PhoneStatusBarView恰恰是StatusBar的核心,負責icons和ticker。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(7)PowerUI的啟動:集中了對電源狀态的一些處理提示 --> 繼承SystemUI
SystemUIService的Oncreate()在啟動完PhoneStatusBar後,會啟動PowerUI。
//PowerUI的詳細解析将下以後為大家分析。
具體: http://www.bubuko.com/infodetail-1137064.html