上文说到:StatusBar , CollapsedStatusBarFragment(status_bar),
现在说到 StatusIcon块,主要负责的是系统状态的显示,比如蓝牙、闹铃、定位、省流量开关等。
这些Icon,都是系统预定好了是哪些。并在一个配置文件定义了slot,或者说是标签。如果你想加一个新类型图标,首先要修改的是这个文件中的config_statusBarIcons数组。
/frameworks/base/core/res/res/values/config.xml
根据 config_statusBarIcons这个id,仅仅发现了它在StatusBarIconControllerImpl 这个类中有被使用。而且是被传入父类构造方法中。
1、Dependency 是SystemUI为了优化耦合依赖关系搞的类,在其start方法中,实例化了大量的Controller类,StatusBarIconContrllerImpl 在其中进行实例化。
2、StatusBar类 是 StatusBar 模块的核心类。
3、PhoneStatusBarPolicy 是负责StatusIcon的添加和更新,是StatusIcon初始化和更新的核心类。
4、StatusBarIconContrllerImpl 是 StatusBarIconController 实现类,提供对IconGroup(即IconManager)的管理。
5、StatusBarIconList 是 StatusBarIconControllerImpl 的父类,保存所有 Status Icon 的 Slot 和对应的Icon。
6、IconManager 负责和View打交道。仔细的同学,应该记得StatusIcon罪恶一生开始地方那两行代码,有DarkIconManager,并将view传入了DarkIconManager。
在SystemUIApplication启动各路服务时,第一被启动的服务组件是Denpendency,为什么?因为在服务数组中它排第一。
在Dependency的start方法中,实例化了impl类,故而根据配置初始化了icon的slot。
在StatusBar的start方法中, 待初始化完毕,实例化PhoneStatusBarPolicy。
// Lastly, call to the icon policy to install/update all the icons.
mIconPolicy = new PhoneStatusBarPolicy(mContext, mIconController);
PhoneStatusBarPolicy的构造方法,完成所有了StatusIcon的初始化和状态监听。
public PhoneStatusBarPolicy(Context context, StatusBarIconController iconController) {
mContext = context;
mIconController = iconController;
mCast = Dependency.get(CastController.class);
mHotspot = Dependency.get(HotspotController.class);
...
mSlotHeadset = context.getString(com.android.internal.R.string.status_bar_headset);
mSlotDataSaver = context.getString(com.android.internal.R.string.status_bar_data_saver);
mSlotLocation = context.getString(com.android.internal.R.string.status_bar_location);
...
// Alarm clock
mIconController.setIcon(mSlotAlarmClock, R.drawable.stat_sys_alarm, null);
mIconController.setIconVisibility(mSlotAlarmClock, false);
// zen
mIconController.setIcon(mSlotZen, R.drawable.stat_sys_zen_important, null);
mIconController.setIconVisibility(mSlotZen, false);
// volume
mIconController.setIcon(mSlotVolume, R.drawable.stat_sys_ringer_vibrate, null);
mIconController.setIconVisibility(mSlotVolume, false);
updateVolumeZen();
...
并在有相关图标状态发生改变后,调用impl的setIcon方法,判断后,进行更新操作。
在IconManager中,尤其是DarkIconManager,通过将生成的StatusBarIconView add to 或 remove from ViewGroup 或 设置 visible,完成 icon 的 显示与隐藏。