4.StatusBar
加图标AddIcons
这里的流程,需要参考到前面的SystemUI的类图,PhoneStatusBar继承自 BaseStatusBar,而BaseStatusBar实现了CommandQueue里的Callbacks接口;而这个接口里面有个关键的addIcon() 方法。
PhoneStatusBar的start() 方法里面调用PhoneStatusBarPolicy的构造器; 注意:这里现在所有的Icon初始,都是不可见的。
此构造器代码片段:
然后,后面依次调
用StatusBarMa
nager,StatusBarManagerService和 CommandQueue的setIcon()方法;
再然后CommandQueue对象回调PhoneStatusBar的AddIcon()方法;最后通过mStatusIconsKeyguard.addView()方法,将Icon显示到界面上。
最后,那些图标真的需要显示了,是通过接收系统广播,然后动态显示,如下图的StatusBarManager对象的setIcon()调用关系:
此部分时序图如下:
(1)Icons排列规则
状态栏的布局文件:
frameworks/base/packages/SystemUI/res/layout/status_bar.xml
此文件 又依次包含下面两个文件:
frameworks/base/packages/SystemUI/res/layout/system_icons.xml
frameworks/base/packages/SystemUI/res/layout/signal_cluster_view.xml
总体来说,Icons的排列分四个区域,容器是 PhoneStatusBarView;com.android.systemui.statusbar.phone.PhoneStatusBarView;它是继承自 PanelBar extends FrameLayout ;
四个区域中,
三个常态从左往右,分别是:应用通知区(gone过量)、系统图标、时钟区; 另外一个动态浮动显示区域,通知提示区(ticker_stub);
系统图标又包含三部分:状态图标、信号区、电量区(默认gone电量百分比);
信号区域包括:VPN、WiFi、手机信号、飞行模式、no_sims;
以上各区域,关系结构图如下:
通知栏 (浮动)通知提示区(ticker_stub) (常态)状态栏 应用通知过量(gone) 应用通知区 系统图标区 信号区 状态 电量icon 手机信号 飞行模式 VPN WiFi
各图标和区域,宽度与互挤原则如下:
时钟 电量百分比(gone) no_sims
其中,只有最左边的 应用通知区 设置了权重,因而它可以得到更多的区域(在其他区动态不显示的时候),如下图XML文件。
其他区域宽度基本都是 (wrap_content);
另外有三个固定宽度,和一个占满宽度(match_parent) ticker :
电量图标宽度9.5dp,
如下图:
wifi_signal_spacer和wifi_airplane_spacer宽高4dp,可见性gone: