Android源码学习 --SystemUI 4 StatusBar与StatusIcon

上文说到:StatusBar , CollapsedStatusBarFragment(status_bar),

现在说到 StatusIcon块,主要负责的是系统状态的显示,比如蓝牙、闹铃、定位、省流量开关等。

这些Icon,都是系统预定好了是哪些。并在一个配置文件定义了slot,或者说是标签。如果你想加一个新类型图标,首先要修改的是这个文件中的config_statusBarIcons数组。

/frameworks/base/core/res/res/values/config.xml
Android源码学习 --SystemUI 4 StatusBar与StatusIcon_第1张图片

根据 config_statusBarIcons这个id,仅仅发现了它在StatusBarIconControllerImpl 这个类中有被使用。而且是被传入父类构造方法中。

在这里插入图片描述
Android源码学习 --SystemUI 4 StatusBar与StatusIcon_第2张图片
其中:

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 的 显示与隐藏。

Android源码学习 --SystemUI 4 StatusBar与StatusIcon_第3张图片

你可能感兴趣的:(Android源码学习 --SystemUI 4 StatusBar与StatusIcon)