天天看點

Android 5.1_SystemUI的啟動流程詳細解析

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

繼續閱讀