Android13下拉状态栏QS面板的加载流程解析

1、QS创建

QSPanel 创建是从 CentralSurfacesImpl#makeStatusBarView 开始的,Qs面板创建这块,与之前版本对比,没啥变化。
com.android.systemui.statusbar.phone.CentralSurfacesImpl.java

protected void makeStatusBarView() {
   
    
    
      ......
      // 设置快速设置面板
      // R.id.qs_frame 是一个 FrameLayout 布局,将 QSFragment 布局添加到其中。所以 R.id.qs_frame 最终显示的是 QSFragment 。
      final View container = mNotificationShadeWindowView.findViewById(R.id.qs_frame);
      if (container != null) {
   
    
    
          FragmentHostManager fragmentHostManager = FragmentHostManager.get(container);
          ExtensionFragmentListener.attachExtensonToFragment(container, QS.TAG, R.id.qs_frame,
                  mExtensionController
                          .newExtension(QS.class)
                          .withPlugin(QS.class)
                          .withDefault(this::createDefaultQSFragment)
                          .build());
          // 亮度控制器
          mBrightnessMirrorController = new BrightnessMirrorController(
                  mNotificationShadeWindowView,
                  mNotificationPanelViewController,
                  mNotificationShadeDepthControllerLazy.get(),
                  mBrightnessSliderFactory,
                  (visible) -> {
   
    
    
                      mBrightnessMirrorVisible = visible;
                      updateScrimController();
                  });
          fragmentHostManager.addTagListener(QS.TAG, (tag, f) -> {
   
    
    
              QS qs = (QS) f;
              if (qs instanceof QSFragment) {
   
    
    
                  mQSPanelController = ((QSFragment) qs).getQSPanelController();
                  ((QSFragment) qs).setBrightnessMirrorController(mBrightnessMirrorController);
              }
          });
      }
      ......
}

接下来就先看看 QSFragment 的 onCreateView() 方法:
com.android.systemui.qs.QSFragment.java

    ......
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
            Bundle savedInstanceState) {
   
    
    
        try {
   
    
    
            Trace.beginSection("QSFragment#onCreateView");
            inflater = inflater.cloneInContext(new ContextThemeWrapper(getContext(),
                    R.style.Theme_SystemUI_QuickSettings));
            // 在这里返回了布局,R.layout.qs_panel
            return inflater.inflate(R.layout.qs_panel, container, false);
        } finally {
   
    
    
            Trace.endSection();
        }
    }
    ......

再看 QSFragment 的构造函数:
com.android.systemui.qs.QSFragment.java

    ......
    @Inject
    public QSFragment(RemoteInputQuickSettingsDisabler remoteInputQsDisabler,
            QSTileHost qsTileHost,
            StatusBarStateController statusBarStateController, CommandQueue commandQueue,
            @Named(QS_PANEL) MediaHost qsMediaHost,
            @Named(QUICK_QS_PANEL) MediaHost qqsMediaHost,
            KeyguardBypassController keyguardBypassController,
            QSFragmentComponent.Factory qsComponentFactory,
            QSFragmentDisableFlagsLogger qsFragmentDisableFlagsLogger,
            FalsingManager falsingManager, DumpManager dumpManager) {
   
    
    
        ......
        mHost = qsTileHost;
        ......
    }
    ......

这里注意 @Inject 注解,这个是 Android dagger里的一种注解。
在这里,与Android 9.0及其以下版本实例化 QSTileHost类的方式不一样,这里是通dagger来实例化的。所以这里实例化了QSTileHost 。
下面我们就进入到 QSTileHost 的构造方法:
com.android.systemui.qs.QSTileHost.java

    ......
    @Inject
    public QSTileHost(Context context,
            StatusBarIconController iconController,
            QSFactory defaultFactory,
            @Main Handler mainHandler,
            @Background Looper bgLooper,
            PluginManager pluginManager,
            TunerService tunerService,
            Provider<AutoTileManager> autoTiles,
            DumpManager dumpManager,
            BroadcastDispatcher broadcastDispatcher,
            Optional<CentralSurfaces> centralSurfacesOptional,
            QSLogger qsLogger,
            UiEventLogger uiEventLogger,
            UserTracker userTracker,
            SecureSettings secureSettings,
            CustomTileStatePersister customTileStatePersister,
            TileServiceRequestController.Builder tileServiceRequestControllerBuilder,
            TileLifecycleManager.Factory tileLifecycleManagerFactory
    ) {
   
    
    
        ......
        mainHandler.post(() -> {
   
    
    
            // This is technically a hack to avoid circular dependency of
            // QSTileHost -> XXXTile -> QSTileHost. Posting ensures creation
            // 在创建任何图块之前完成。
            tunerService.addTunable(this, TILES_SETTING);
            // AutoTileManager 可以修改 mTiles,因此请确保 mTiles 已经初始化。
            mAutoTiles = autoTiles.get();
            mTileServiceRequestController.init();
        })