SystemUI 7.0學習總結一-SystemUI的啟動

最近在學習并接觸SystemUI模塊的工作评汰,Keyguard做為引入庫也納入了SystemUI的大家庭,所以整體感覺SystemUI模塊還是挺大的哭懈,為了日后的查閱還是要寫一下筆記凿渊。筆記記錄過程中參考了許多網友的文章笼呆,在本文最后的文章參考會一一羅列带到,在此非常感謝他們的分享昧碉。

SystemUI概覽

SystemUI屬于系統(tǒng)級的apk,位置在frameworks\base\packages\SystemUI阴孟,主要功能有:

狀態(tài)欄信息顯示,比如電池税迷,wifi信號,3G/4G等icon顯示

通知面板箭养,比如系統(tǒng)消息慕嚷,第三方應用消息

近期任務欄顯示面板,比如長按近期任務快捷鍵毕泌,顯示近期使用的應用

截圖服務

壁紙服務

……

SystemUI的啟動流程

SystemServer啟動后喝检,會在Main Thread啟動ActivityManagerService,當ActivityManagerService systemReady后撼泛,會去啟動SystemUIService挠说。?

SystemServer路徑:/base/services/java/com/android/server/SystemServer.java

mActivityManagerService.systemReady(newRunnable() {@Overridepublicvoidrun() {? ? ? ? ? ? ? ? Slog.i(TAG,"Making services ready");? ? ? ? ? ? ? ? ......? ? ? ? ? ? ? ? Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER,"StartSystemUI");try{? ? ? ? ? ? ? ? ? ? startSystemUi(context);? ? ? ? ? ? ? ? }catch(Throwable e) {? ? ? ? ? ? ? ? ? ? reportWtf("starting System UI", e);? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);? ? ? ? ? ? ? ? ......? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? });

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

在這個方法里啟動一個SystemUIService服務,

static final void startSystemUi(Context context) {? ? ? ? Intent intent = new Intent();intent.setComponent(new ComponentName("com.android.systemui","com.android.systemui.SystemUIService"));intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);//Slog.d(TAG,"Starting service: "+ intent);context.startServiceAsUser(intent, UserHandle.SYSTEM);}

1

2

3

4

5

6

7

8

通過startServiceAsUser愿题,SystemUIService就啟動了损俭,即SystemUI進程開機啟動。

publicclassSystemUIServiceextendsService{@OverridepublicvoidonCreate() {super.onCreate();? ? ? ? ((SystemUIApplication) getApplication()).startServicesIfNeeded();? ? }? ? ......

1

2

3

4

5

6

7

8

在SystemUIService的onCreate方法中會調用SystemUIApplication的startServicesIfNeeded方法潘酗,這個方法會調用 startServicesIfNeeded(SERVICES)方法啟動一系列服務(并不是真正的service,都繼承自SystemUI)杆兵。

public class SystemUIApplication extends Application {? ? ....../**

? ? * The classes of the stuff to start.

? ? */private final Class[] SERVICES = new Class[] {com.android.systemui.tuner.TunerService.class,com.android.systemui.keyguard.KeyguardViewMediator.class,com.android.systemui.recents.Recents.class,com.android.systemui.volume.VolumeUI.class,? ? ? ? ? ? Divider.class,com.android.systemui.statusbar.SystemBars.class,com.android.systemui.usb.StorageNotification.class,com.android.systemui.power.PowerUI.class,com.android.systemui.media.RingtonePlayer.class,com.android.systemui.keyboard.KeyboardUI.class,com.android.systemui.tv.pip.PipUI.class,com.android.systemui.shortcut.ShortcutKeyDispatcher.class,com.android.systemui.VendorServices.class};......? ? public void startServicesIfNeeded() {? ? ? ? startServicesIfNeeded(SERVICES);}}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

startServicesIfNeeded方法會遍歷SERVICES 這個數組,依次調用service的start方法啟動服務。

privatevoidstartServicesIfNeeded(Class[] services) {if(mServicesStarted) {return;? ? ? ? }if(!mBootCompleted) {// check to see if maybe it was already completed long before we began// see ActivityManagerService.finishBooting()if("1".equals(SystemProperties.get("sys.boot_completed"))) {? ? ? ? ? ? ? ? mBootCompleted =true;if(DEBUG) Log.v(TAG,"BOOT_COMPLETED was already sent");? ? ? ? ? ? }? ? ? ? }? ? ? ? Log.v(TAG,"Starting SystemUI services for user "+? ? ? ? ? ? ? ? Process.myUserHandle().getIdentifier() +".");? ? ? ? finalintN = services.length;for(inti=0; i cl = services[i];if(DEBUG) Log.d(TAG,"loading: "+ cl);try{? ? ? ? ? ? ? ? Object newService = SystemUIFactory.getInstance().createInstance(cl);? ? ? ? ? ? ? ? mServices[i] = (SystemUI) ((newService ==null) ? cl.newInstance() : newService);? ? ? ? ? ? }catch(IllegalAccessException ex) {thrownewRuntimeException(ex);? ? ? ? ? ? }catch(InstantiationException ex) {thrownewRuntimeException(ex);? ? ? ? ? ? }? ? ? ? ? ? mServices[i].mContext =this;? ? ? ? ? ? mServices[i].mComponents = mComponents;if(DEBUG) Log.d(TAG,"running: "+ mServices[i]);? ? ? ? ? ? mServices[i].start();if(mBootCompleted) {? ? ? ? ? ? ? ? mServices[i].onBootCompleted();? ? ? ? ? ? }? ? ? ? }? ? ? ? mServicesStarted =true;? ? }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

看到這里仔夺,這么多文字可能不夠直觀琐脏,那就看看圖吧,非常感謝參考文章中的分享。?

這里以SERVICES 中com.android.systemui.keyguard.KeyguardViewMediator.class為例日裙,?

SystemUI Services啟動后吹艇,根據各Services的功能,SystemUI的各個模塊就開始正常工作起來了阅签。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末掐暮,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子政钟,更是在濱河造成了極大的恐慌路克,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件养交,死亡現場離奇詭異精算,居然都是意外死亡,警方通過查閱死者的電腦和手機碎连,發(fā)現死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門灰羽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鱼辙,你說我怎么就攤上這事廉嚼。” “怎么了倒戏?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵怠噪,是天一觀的道長。 經常有香客問我杜跷,道長傍念,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任葛闷,我火速辦了婚禮憋槐,結果婚禮上,老公的妹妹穿的比我還像新娘淑趾。我一直安慰自己阳仔,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布扣泊。 她就那樣靜靜地躺著驳概,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旷赖。 梳的紋絲不亂的頭發(fā)上顺又,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音等孵,去河邊找鬼稚照。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的果录。 我是一名探鬼主播上枕,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弱恒!你這毒婦竟也來了辨萍?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤返弹,失蹤者是張志新(化名)和其女友劉穎锈玉,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體义起,經...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡拉背,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了默终。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椅棺。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖齐蔽,靈堂內的尸體忽然破棺而出两疚,到底是詐尸還是另有隱情,我是刑警寧澤含滴,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布诱渤,位于F島的核電站,受9級特大地震影響蛙吏,放射性物質發(fā)生泄漏源哩。R本人自食惡果不足惜鞋吉,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一鸦做、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谓着,春花似錦泼诱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舷蒲,卻和暖如春耸袜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牲平。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工堤框, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓蜈抓,卻偏偏與公主長得像启绰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子沟使,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,133評論 25 707
  • afinalAfinal是一個android的ioc委可,orm框架 https://github.com/yangf...
    passiontim閱讀 15,429評論 2 45
  • ```java /* * Copyright (C) 2006 The Android Open Source P...
    mrganer閱讀 1,145評論 0 50
  • “我心里不平衡”,曾經有個患者這么跟我們說腊嗡,這句話與疾病本身無關着倾,而是因為前面一個患者看病看了差不多半個小時...
    每周小記閱讀 1,324評論 0 1
  • 老了難/老了唱歌真的難/沒比十八二十二 /唱歌音過九重山 老人回憶兒時教她和她的小伙伴們唱山歌的一對年輕夫婦,說他...
    郭零閱讀 2,193評論 0 0