状态栏与导航栏的启动由StatusBar.start()完成
/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@Override
public void start() {
mNetworkController = Dependency.get(NetworkController.class);
mUserSwitcherController = Dependency.get(UserSwitcherController.class);
mScreenLifecycle = Dependency.get(ScreenLifecycle.class);
mScreenLifecycle.addObserver(mScreenObserver);
mWakefulnessLifecycle = Dependency.get(WakefulnessLifecycle.class);
mWakefulnessLifecycle.addObserver(mWakefulnessObserver);
mBatteryController = Dependency.get(BatteryController.class);
mAssistManager = Dependency.get(AssistManager.class);
mSystemServicesProxy = SystemServicesProxy.getInstance(mContext);
mOverlayManager = IOverlayManager.Stub.asInterface(
ServiceManager.getService(Context.OVERLAY_SERVICE));
mColorExtractor = Dependency.get(SysuiColorExtractor.class);
mColorExtractor.addOnColorsChangedListener(this);
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
mForegroundServiceController = Dependency.get(ForegroundServiceController.class);
mDisplay = mWindowManager.getDefaultDisplay();
updateDisplaySize();
......
//创建状态栏与导航栏的窗口
createAndAddWindows();
......
}
跟踪createAndAddWindows():
/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
public void createAndAddWindows() {
addStatusBarWindow();
}
private void addStatusBarWindow() {
makeStatusBarView();
//创建StatusBarWindowManager对象
mStatusBarWindowManager = Dependency.get(StatusBarWindowManager.class);
mRemoteInputController = new RemoteInputController(mHeadsUpManager);
//调用它的add()函数为StatusBar创建窗口,包括窗口的大小、位置、是否透明等属性。getStatusBarHeight()为StatusBar的高度,由com.android.internal.R.dimen.status_bar_height确定
mStatusBarWindowManager.add(mStatusBarWindow, getStatusBarHeight());
}
先来分析makeStatusBarView()函数:
protected void makeStatusBarView() {
final Context context = mContext;
//获取屏幕参数
updateDisplaySize(); // populates mDisplayMetrics
//更新Panels资源数据,statusbar包含很多panel,在创建PhoneStatusBarView时需要更新panel数据
updateResources();
updateTheme();
//引入StatusBarWindowView布局
inflateStatusBarWindow(context);
//statusbarwindow
mStatusBarWindow.setService(this);
//设置触摸事件监听器
mStatusBarWindow.setOnTouchListener(getStatusBarWindowTouchListener());
// TODO: Deal with the ugliness that comes from having some of the statusbar broken out
// into fragments, but the rest here, it leaves some awkward lifecycle and whatnot.
mNotificationPanel = (NotificationPanelView) mStatusBarWindow.findViewById(
R.id.notification_panel);
mStackScroller = (NotificationStackScrollLayout) mStatusBarWindow.findViewById(
R.id.notification_stack_scroller);
mNotificationPanel.setSt