这⾥写图⽚描述
这⾥写图⽚描述
可以看到有⼀句 ((SystemUIApplication) getApplication()).startServicesIfNeeded(),这句很关键,我们再进⼊
startServicesIfNeeded(),看看具体是如何启动系统服务的。该⽅法如下:
这⾥写图⽚描述
其中有⼀个 for 循环,循环⾥第⼀句就是将 rvice[i] 赋值给 cl, 那么rvice⾥存的是什么呢?找到 rvice[i] 的赋值如下:
这⾥写图⽚描述
看到这⾥我们就明⽩了,这⾥是拿到每个和 SystemUI 相关的类的反射,存到了 rvice[] ⾥,然后赋值给cl,紧接着将通过反射将其转化为具体类的对象,存到了mService[i]数组⾥,最后对象调 start() ⽅法启动相关类的服务,启动完成后,回调 onBootCompleted( ) ⽅法。mService[i] ⾥的值不同时,
调⽤的 start() ⽅法也不相同,这⾥我们以S ystemBars 的 start() 为例,所以mService[i].start() 先认为是SystemBars.start().
SystemBars.java 位于framework/ba/packages/SystemUI/res/com/android/systemui/statusbar/SystemBars.java ,找到
start() ⽅法:
这⾥写图⽚描述
这⾥调⽤了 mServiceMonitor.start(),旁边注释说的很清楚如果服务没有启动的话就调⽤onNoService()⽅法,进⼊ onNoService() ⽅法,该⽅法就位于 start() ⽅法下⽅,可以看到⽅法中调⽤了CreateStatusBarFromConfig() 该⽅法如下:
这⾥写图⽚描述
从中可以知道,该⽅法中先读取 l ⽂件中 config_statusBarComponent 的值,这⾥为:
com.android.systemui.statusbar.phone.PhoneStatusBar,然后通过反射得到了 PhoneStatusBar 对象,
养了一条蛇最后的 mStartus.start() 也就等于 PhoneStatusBar.start(),进⼊该⽅法,会发现,⾥⾯调⽤了super.start(),也就是先执⾏了⽗类的 start() ,其⽗类为 BaStatusBar,该类的star()⽅法较多,就不放出来了,我们看重点,找到⾥⾯有调⽤⼀个 createAndAddWindows(),该⽅法为抽象⽅法,则会调⽤它的⼦类的⽅法,这⾥也就是 PhoneStatusBar 的 createAndAddWindows()⽅法,如下:
职业高中招生
这⾥写图⽚描述
createAndAddWindows() ⾥只调⽤了 addStaBarWindow() ⽅法,⽽在该⽅法⾥,调⽤了makeStartusBarView,看名字就知道该⽅法关键,意为构建statusBar视图。该⽅法很长,⾥⾯有inflateStatusBarWindow(),进⼊该⽅法,可以看到,这么⼀句:
这⾥写图⽚描述
然后,我们通过 super_l 的分析 SystemBars 的⼤致视图构成了,super_l 代码如下:
饺子好吃这⾥写图⽚描述
博客小镇
super_l
super_l 中 include 了⼀个名称为 status_bar 的布局⽂件恶言
super_l*中 include 了⼀个名称为 status_bar_expanded 的布局⽂件
香蕉的营养价值
这⾥的 status_bar 便是系统状态栏的布局⽂件,status_bar_expanded 便是下拉的通知窗⼝的布局⽂件
上述 super_l 与如下视图对应:
花园散步
这⾥写图⽚描述
猴成语
PhoneStatusBarView 即为⼿机最上⽅的状态栏,主要⽤于显⽰系统状态,通知等,主要包括 notification icons 和 status bar icons。l 即对应状态栏的视图如下: