SystemUI 7.0学习笔记三-QSPanel

本文详细介绍了Android SystemUI 7.0中QSPanel(Quick Settings Panel)的加载流程,从PhoneStatusBar的makeStatusBarView()方法开始,经过QSContainer的inflation,QSTileHost的创建,再到TunerService和资源文件中的tiles配置。通过源码分析,揭示了如何将QSTiles加载到QSPanel,并最终在PagedTileLayout中展示,涉及关键类如QSPanel、QSTileHost和PagedTileLayout的操作。
摘要由CSDN通过智能技术生成

QSPanel加载流程

首先通过一张图了解一下,如图红色区域就是QSPanel:包含亮度条和Quick Settings;本节的重点是后者。
这里写图片描述

QSPanel是StatusBar的一部分,自然是随着StatusBar的加载而加载,SystemUI 7.0学习笔记二-状态栏和导航栏介绍了状态栏的加载实在PhoneStatusBar的makeStatusBarView()中完成的;其实,这个方法完成了很多systemui重要组件的加载工作。再来回顾一下代码。
PhoneStatusBar.makeStatusBarView():

protected PhoneStatusBarView makeStatusBarView() {
    final Context context = mContext;

    inflateStatusBarWindow(context);
    ......
    // 这里完成了许多systemui关键组件的view创建
    ......
    // Set up the quick settings tile panel
    AutoReinflateContainer container = (AutoReinflateContainer) mStatusBarWindow.findViewById(
                R.id.qs_auto_reinflate_container);
        if (container != null) {
            final QSTileHost qsh = SystemUIFactory.getInstance().createQSTileHost(mContext, this,
                    mBluetoothController, mLocationController, mRotationLockController,
                    mNetworkController, mZenModeController, mHotspotController,
                    mCastController, mFlashlightController,
                    mUserSwitcherController, mUserInfoController, mKeyguardMonitor,
                    mSecurityController, mBatteryController, mIconController,
                    mNextAlarmController);
            mBrightnessMirrorController = new BrightnessMirrorController(mStatusBarWindow);
            container.addInflateListener(new InflateListener() {
                @Override
                public void onInflated(View v) {
                    QSContainer qsContainer = (QSContainer) v.findViewById(
                            R.id.quick_settings_container);
                    qsContainer.setHost(qsh);
                    mQSPanel = qsContainer.getQsPanel();
                    mQSPanel.setBrightnessMirror(mBrightnessMirrorController);
                    mKeyguardStatusBar.setQSPanel(mQSPanel);
                    mHeader = qsContainer.getHeader();
                    initSignalCluster(mHeader);
                    mHeader.setActivityStarter(PhoneStatusBar.this);
                }
            });
        }
        ......
}

这里发现了mQSPanel,它是在QSContainer的onFinishInflate()中inflate的,接着SystemUIFactory通过createQSTileHost()调用new QSTileHost(…)创建了QSTileHost对象。
QSTileHost的继承关系及构造方法:

public class QSTileHost implements QSTile.Host, Tunable {
   

    public QSTileHost(Context context, PhoneStatusBar statusBar, ...) {

        ......
        TunerService.get(mContext).addTunable(this, TILES_SETTING);
    }
}

注意:这里的TunerService是在SystemUI学习总结一-SystemUI的启动中和SystemBars等服务一起在SystemUIApplication开启的。

看到SERVICES 就想起来了吧!

    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.clas
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值