android Q SystemUI

SystemUI 启动

SystemServer.startOtherServices->startSystemUi
启动SystemUIService进而通过((SystemUIApplication) getApplication()).startServicesIfNeeded()
启动一系列继承SystemUI的类
其中SystemBar.start()中通过反射构造出StatusBar的实列,进一步调用mStatusBar.start()

状态栏的加载

StatusBar.createAndAddWindows(result);
public void createAndAddWindows(@Nullable RegisterStatusBarResult result) {
//初始化mStatusBarWindow
makeStatusBarView(result);
//获取mStatusBarWindowController
mStatusBarWindowController = Dependency.get(StatusBarWindowController.class);
//将mStatusBarWindow通过mWindowManager.addView(mStatusBarView, mLp);方式添加到Window中
mStatusBarWindowController.add(mStatusBarWindow, getStatusBarHeight());
}

makeStatusBarView中status_bar_container由CollapsedStatusBarFragment来填充

CollapsedStatusBarFragment 加载status_bar
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(R.layout.status_bar, container, false);
}


 @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    android.util.Log.e(TAG,"onViewCreated");
    mStatusBar = (PhoneStatusBarView) view;
    if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_PANEL_STATE)) {
        mStatusBar.restoreHierarchyState(
                savedInstanceState.getSparseParcelableArray(EXTRA_PANEL_STATE));
    }
	//构造DarkIconManager
    mDarkIconManager = new DarkIconManager(view.findViewById(R.id.statusIcons));
    mDarkIconManager.setShouldLog(true);
	//通过StatusBarIconController.addIconGroup将wifi,mobile等图标加载到状态栏中
    Dependency.get(StatusBarIconController.class).addIconGroup(mDarkIconManager);
    mSystemIconArea = mStatusBar.findViewById(R.id.system_icon_area);
    mClockView = mStatusBar.findViewById(R.id.clock);
    showSystemIconArea(false);
    showClock(false);
    initEmergencyCryptkeeperText();
    initOperatorName();
}

Service 中addView用Fragment填充内容

具体在StatusBar.createAndAddWindows中实现
关键点在于FragmentManager的获取

1,初始化 FragmentController mFragments
private void createFragmentHost(Parcelable savedState) {

	//获取FragmentController,最重要的就是HostCallbacks的自定义,其中onFindViewById必须复写
    mFragments = FragmentController.createController(new HostCallbacks());
	//关联父Fragment,不需要关联故attachHost(null)
    mFragments.attachHost(null);
    mLifecycleCallbacks = new FragmentLifecycleCallbacks() {
        @Override
        public void onFragmentViewCreated(FragmentManager fm, Fragment f, View v,
                Bundle savedInstanceState) {
            FragmentHostManager.this.onFragmentViewCreated(f);
            Log.e("FragmentHostManager","onFragmentViewCreated f="+f+",view="+v);
        }

        @Override
        public void onFragmentViewDestroyed(FragmentManager fm, Fragment f) {
            FragmentHostManager.this.onFragmentViewDestroyed(f);
        }

        @Override
        public void onFragmentDestroyed(FragmentManager fm, Fragment f) {
            Dependency.get(LeakDetector.class).trackGarbage(f);
        }
    };
	//管理Fragment生命周期
    mFragments.getFragmentManager().registerFragmentLifecycleCallbacks(mLifecycleCallbacks,
            true);
    if (savedState != null) {
        mFragments.restoreAllState(savedState, (FragmentManagerNonConfig) null);
    }
	
    // For now just keep all fragments in the resumed state.
    mFragments.dispatchCreate();
    mFragments.dispatchStart();
    mFragments.dispatchResume();
}

class HostCallbacks extends FragmentHostCallback<FragmentHostManager> {
    public HostCallbacks() {
        super(mContext, FragmentHostManager.this.mHandler, 0);
    }

    @Override
    public FragmentHostManager onGetHost() {
        return FragmentHostManager.this;
    }

    @Override
    public void onDump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
        FragmentHostManager.this.dump(prefix, fd, writer, args);
    }

    @Override
    public Fragment instantiate(Context context, String className, Bundle arguments) {
        return mPlugins.instantiate(context, className, arguments);
    }

    @Override
    public boolean onShouldSaveFragmentState(Fragment fragment) {
        return true; // True for now.
    }

    @Override
    public LayoutInflater onGetLayoutInflater() {
        return LayoutInflater.from(mContext);
    }

    @Override
    public boolean onUseFragmentManagerInflaterFactory() {
        return true;
    }

    @Override
    public boolean onHasWindowAnimations() {
        return false;
    }

    @Override
    public int onGetWindowAnimations() {
        return 0;
    }

    @Override
    public void onAttachFragment(Fragment fragment) {
    }


	///此方法必须覆写,否则返回null,因为没有view而不会显示Fragment内容
    @Override
    @Nullable
    public <T extends View> T onFindViewById(int id) {
        return FragmentHostManager.this.findViewById(id);
    }

    @Override
    public boolean onHasView() {
        return true;
    }
}

//mRootView是mWindowManager.addView(mStatusBarView, mLp) 中的mStatusBarView.
private <T extends View> T findViewById(int id) {
    return mRootView.findViewById(id);
}

2,获取FragmentManager mFragments.getFragmentManager()
如此便可以在Service中使用Fragment了

信号栏图标的更新

NetworkControllerImpl 监控网络状态的变化(wifi,telephony)
mWifiSignalController 负责wifi
mMobileSignalControllers 负责mobileSignal

public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallback

mNetworkController.addCallback(this);将NetworkControllerImpl与StatusBarSignalPolicy绑定起来
进而通过CallbackHandler将SignalController与StatusBarSignalPolicy关联起来 ------------mCallbackHandler.setListening

当NetworkControllerImpl接到wifi状态发生变化时,通过mWifiSignalController更新wifi状态,然后通过callback.setWifiIndicators来更新UI
即StatusBarSignalPolicy.setWifiIndicators–>IconController来真正更新UI

StatusBarSignalPolicy.SignalIconState
WifiIconState extends SignalIconState
MobileIconState extends SignalIconState
StatusBarMobileView------------>sim信号
StatusBarWifiView-------------->wifi信号
根据SignalIconState来设置当前的UI

NetworkControllerImpl可以监控网络状态的变化
mCallbackHandler负责将SignalController与StatusBarSignalPolicy关联起来
StatusBarSignalPolicy负责逻辑处理并通过IconController来实现UI的更新
StatusBarIconControllerImpl 管理更新signalIcon

以wifi状态的改变逻辑如下:
NetworkControllerImpl.updateConnectivity->pushConnectivityToSignals
mWifiSignalController.updateConnectivity 此处保存旧的WifiIconState并通知是否更新->notifyListenersIfNecessary->notifyListeners
callback.setWifiIndicators即StatusBarSignalPolicy.setWifiIndicators->updateWifiIconWithState
mIconController.setSignalIcon即StatusBarIconControllerImpl.setSignalIcon->setIcon->handleSet
IconManager.onSetIconHolder->onSetSignalIcon
StatusBarWifiView.applyWifiState(state)

锁屏壁纸

NotificationMediaManager 负责绘制锁屏壁纸

public void setup(BackDropView backdrop, ImageView backdropFront, ImageView backdropBack,
        ScrimController scrimController, LockscreenWallpaper lockscreenWallpaper) {
    mBackdrop = backdrop;
    mBackdropFront = backdropFront;
    mBackdropBack = backdropBack;
    mScrimController = scrimController;
    mLockscreenWallpaper = lockscreenWallpaper;
}

mBackdrop是展现壁纸的父View,壁纸设置在mBackdropBack上

finishUpdateMediaMetaData中完成壁纸的获取和设置
final boolean hasArtwork = artworkDrawable != null;即表示是否有独立的锁屏壁纸

mScrimController控制ScrimView的显示

ScrimState中的AOD和PULSING会根据hasArtWork来设置mCurrentBehindAlpha即mScrimBehind的alpha,决定是否遮挡住锁屏壁纸的显示

通知加载过程

NotificationEntryManager
NotificationListController
StatusBarNotificationPresenter

import android.service.notification.NotificationListenerService;
NotificationListenerWithPlugins extends NotificationListenerService
NotificationListener extends NotificationListenerWithPlugins
onNotificationPosted
mEntryManager.addNotification(sbn, rankingMap);
addNotificationInternal
requireBinder().inflateViews
NotificationRowBinderImpl.inflateViews->updateNotification
ExpandableNotificationRow.inflateViews()
NotificationInflater.inflateNotificationViews
AsyncInflationTask.execute
NotificationInflater.apply->applyRemoteView->onViewApplied->finishIfDone
NotificationEntryManager.onAsyncInflationFinished
StatusBarNotificationPresenter-1,onEntryInflated;2,onBeforeNotificationAdded;3,onNotificationAdded
NotificationEntryManager.updateNotifications
StatusBarNotificationPresenter.updateNotificationViews();
mViewHierarchyManager.updateNotificationViews();
mNotificationPanel.updateNotificationViews();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值