史上最詳細的Android系統SystemUI 啟動過程詳細解析

注:
原文來自我的CSDN博客:http://blog.csdn.net/foreverJQQ/article/details/76268404

Android 系統 SystemUI 介紹

Android 的 SystemUI 其實就是 Android 的系統界面,它包括了界面上方的狀態(tài)欄 status bar焕参,下方的導航欄Navigation Bar霞势,鎖屏界面 Keyguard ,電源界面 PowerUI泞坦,近期任務界面 Recent Task 等等窖贤。對于用戶而言,SystemUI 的改動是最能直觀感受到的贰锁。因此赃梧,每個 Android 版本在 SystemUI 上都有比較大的改動。而對開發(fā)者而言豌熄,理解 Android SystemUI 對優(yōu)化Android系統界面授嘀,改善用戶體驗十分重要。

SystemUI 在哪

在 Andorid 系統源碼中锣险,package/apps下放的是系統內置的一些 app蹄皱,例如 settings,camera芯肤,Phone巷折,Message 等等。而在 Framework/base/package 下崖咨,它們也是系統的 app锻拘,SystemUI 就在此目錄下。它控制著整個Android系統的界面掩幢,但其實他也是一個 app逊拍,不同于一般的 app上鞠,它不可卸載也不可以被第三方應用替換。

SystemUI 整體結構

這里寫圖片描述

這是 SystemUI 相關類的繼承關系圖芯丧,可以看到 SystemUI 為基類芍阎,每個子類實現了不同的系統界面。

  • Status Bar 系統上方的狀態(tài)欄
  • Navigator Bar 系統下方的導航欄
  • Keyguard 鎖屏界面
  • PowerUI 電源界面
  • Recents Screen 近期任務界面
  • VolumeUI 音量調節(jié)對話框
  • Stack Divider 分屏功能調節(jié)器
  • PipUI 畫中畫界面
  • Screenshot 截屏界面
  • RingtonePlayer 鈴聲播放器界面
  • Settings Activity 系統設置中用到的一些界面缨恒,例如:NetworkOverLimitActivity谴咸,UsbDebuggingActivity等。
這里寫圖片描述

SystemUI的啟動流程

先找到 framework/base/service/java/com/android/server/SystemServer.java 文件骗露,里面有個main()方法岭佳,main 方法如下:

public static void main(String[] args){
    new SystemServer().run()
}

main 方法里啟動了 run() 方法,而在 run 方法中調用了 startBootstrapServices() 方法和 startOtherServices() 方法萧锉,在 startOtherServices() 里 mActivityManagerService.systemReady 創(chuàng)建線程去執(zhí)行startSystemUi(context)珊随,這里將啟動 SystemUI。具體方法如下:

這里寫圖片描述

然后我們進入設置啟動 systemui 程序的 SystemUIService 文件里柿隙,該文件在framework/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java.我們看該文件的onCreate() 方法叶洞。方法如下:

這里寫圖片描述

可以看到有一句 ((SystemUIApplication) getApplication()).startServicesIfNeeded(),這句很關鍵禀崖,我們再進入 startServicesIfNeeded()衩辟,看看具體是如何啟動系統服務的。該方法如下:


這里寫圖片描述

其中有一個 for 循環(huán)波附,循環(huán)里第一句就是將 service[i] 賦值給 cl艺晴, 那么service里存的是什么呢?找到 service[i] 的賦值如下:

這里寫圖片描述

看到這里我們就明白了掸屡,這里是拿到每個和 SystemUI 相關的類的反射封寞,存到了 service[] 里,然后賦值給cl折晦,緊接著將通過反射將其轉化為具體類的對象钥星,存到了mService[i]數組里,最后對象調 start() 方法啟動相關類的服務满着,啟動完成后,回調 onBootCompleted( ) 方法贯莺。
mService[i] 里的值不同時风喇,調用的 start() 方法也不相同,這里我們以S ystemBars 的 start() 為例缕探,所以mService[i].start() 先認為是 SystemBars.start().
SystemBars.java 位于framework/base/packages/SystemUI/res/com/android/systemui/statusbar/SystemBars.java 魂莫,找到 start() 方法:


這里寫圖片描述

這里調用了 mServiceMonitor.start(),旁邊注釋說的很清楚如果服務沒有啟動的話就調用onNoService()方法爹耗,進入 onNoService() 方法耙考,該方法就位于 start() 方法下方谜喊,可以看到方法中調用了CreateStatusBarFromConfig() 該方法如下:

這里寫圖片描述

從中可以知道,該方法中先讀取 value/config.xml 文件中 config_statusBarComponent 的值,這里為:com.android.systemui.statusbar.phone.PhoneStatusBar倦始,然后通過反射得到了 PhoneStatusBar 對象斗遏,最后的 mStartus.start() 也就等于 PhoneStatusBar.start(),進入該方法鞋邑,會發(fā)現诵次,里面調用了super.start(),也就是先執(zhí)行了父類的 start() ,其父類為 BaseStatusBar枚碗,該類的star()方法較多逾一,就不放出來了,我們看重點肮雨,找到里面有調用一個 createAndAddWindows()遵堵,該方法為抽象方法,則會調用它的子類的方法怨规,這里也就是 PhoneStatusBar 的 createAndAddWindows()方法陌宿,如下:

這里寫圖片描述

createAndAddWindows() 里只調用了 addStaBarWindow() 方法,而在該方法里椅亚,調用了makeStartusBarView限番,看名字就知道該方法關鍵,意為構建statusBar視圖呀舔。該方法很長弥虐,里面有inflateStatusBarWindow(),進入該方法媚赖,可以看到霜瘪,這么一句:

這里寫圖片描述

然后,我們通過 super_status_bar.xml 的分析 SystemBars 的大致視圖構成了惧磺,super_status_bar.xml 代碼如下:

這里寫圖片描述

super_status_bar.xml
super_status_bar.xml 中 include 了一個名稱為 status_bar 的布局文件
super_status_bar.xml*中 include 了一個名稱為 status_bar_expanded 的布局文件
這里的 status_bar 便是系統狀態(tài)欄的布局文件颖对,status_bar_expanded 便是下拉的通知窗口的布局文件
上述 super_status_bar.xml 與如下視圖對應:

這里寫圖片描述

PhoneStatusBarView 即為手機最上方的狀態(tài)欄,主要用于顯示系統狀態(tài)磨隘,通知等缤底,主要包括 notification icons 和 status bar icons。status_bar.xml 即對應狀態(tài)欄的視圖如下:

這里寫圖片描述

PanelHolder
PanelHolder是用戶下拉 status bar 后得到的 view番捂。它主要包含 QuickSettings 和 Notification panel 兩個部分个唧。
PanelHolder是一個繼承自 FrameLayout的自定義 view,它的內容是通過 include status_bar_expanded.xml進行填充的。
PanelHolder的布局比較復雜设预,為了提高 view 的重用性大量的使用了 include 標簽徙歼。
status_bar_expanded.xml 對應的視圖:

這里寫圖片描述

KeyguardBouncer
KeyguardBouncer是鎖屏解鎖界面,根據用戶設置的解鎖方式不同,展示不同的解鎖模式魄梯。
keyguard_bouncer.xml 對應的 KerguardBouncer 視圖:

這里寫圖片描述

附:
SystemUI啟動流程圖:

這里寫圖片描述

這里寫圖片描述

參考文章
http://www.reibang.com/p/0ab1279465fa
http://qiangbo.space/2017-05-09/AndroidAnatomy_SystemUI_Intro/
http://qiangbo.space/2017-06-04/AndroidAnatomy_SystemUI_Bar/
http://www.open-open.com/lib/view/open1494316049681.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末桨螺,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子酿秸,更是在濱河造成了極大的恐慌灭翔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件允扇,死亡現場離奇詭異缠局,居然都是意外死亡,警方通過查閱死者的電腦和手機考润,發(fā)現死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門狭园,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人糊治,你說我怎么就攤上這事唱矛。” “怎么了井辜?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵绎谦,是天一觀的道長。 經常有香客問我粥脚,道長窃肠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任刷允,我火速辦了婚禮冤留,結果婚禮上,老公的妹妹穿的比我還像新娘树灶。我一直安慰自己纤怒,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布天通。 她就那樣靜靜地躺著泊窘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪像寒。 梳的紋絲不亂的頭發(fā)上烘豹,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音诺祸,去河邊找鬼吴叶。 笑死,一個胖子當著我的面吹牛序臂,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奥秆,長吁一口氣:“原來是場噩夢啊……” “哼逊彭!你這毒婦竟也來了?” 一聲冷哼從身側響起构订,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤侮叮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后悼瘾,有當地人在樹林里發(fā)現了一具尸體囊榜,經...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年亥宿,在試婚紗的時候發(fā)現自己被綠了卸勺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡烫扼,死狀恐怖曙求,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情映企,我是刑警寧澤悟狱,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站堰氓,受9級特大地震影響挤渐,放射性物質發(fā)生泄漏。R本人自食惡果不足惜双絮,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一浴麻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掷邦,春花似錦白胀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宣蔚,卻和暖如春向抢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胚委。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工挟鸠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亩冬。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓艘希,卻偏偏與公主長得像硼身,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子覆享,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理佳遂,服務發(fā)現,斷路器撒顿,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 上師范的時候丑罪,三毛去世了。 愛了她很久凤壁,讀了很多她的書吩屹,青春的血液里滿是撒哈拉的沙漠,還為她寫了些狂妄不羈的文字拧抖,...
    江兆勇Jon閱讀 472評論 3 10
  • 即日起煤搜,每讀完一遍,寫一篇讀后感徙鱼,字數不限宅楞,只求及時記錄感想,靈感袱吆。 從不同角度看書厌衙,未來每次看,可以有一個主要抓...
    李茂林_1063閱讀 360評論 0 0
  • 7.7.9 對象串行化(序列化)1 對象也是一種在內存中存儲的數據類型绞绒,他的壽命通常隨著生成該對象的程序終止而終止...
    曹淵說創(chuàng)業(yè)閱讀 397評論 0 0