Android SystemBar启动流程分析
SystemBars的服务被start时,最终会调用该类的onNoService()方法。
@Override
public void start() {
if (DEBUG) Log.d(TAG, "start");
ServiceMonitor mServiceMonitor = new ServiceMonitor(TAG, DEBUG,
mContext, Settings.Secure.BAR_SERVICE_COMPONENT, this);
mServiceMonitor.start(); // will call onNoService if no remote service is found }
@Override
public void onNoService() {
if (DEBUG) Log.d(TAG, "onNoService");
createStatusBarFromConfig(); // fallback to using an in-process implementation }
private void createStatusBarFromConfig() {
…
mStatusBar = (BaseStatusBar) cls.newInstance();
…
mStatusBar.start();
}
BaseStatusBar是一个抽象类,故调用其子类的PhoneStatusBar的start 函数。
@Override
public void start() {
…
super.start();
…
}
子类的start又调用了父类的start
public void start() {
…
createAndAddWindows();
…
}
protected abstract void createAndAddWindows();
父类的start调用了一个createAndAddWindows()方法,此方法是抽象方法,最终调用的还是PhoneStatusBar的createAndAddWindows方法。
@Override
public void createAndAddWindows() {
addStatusBarWindow();
}
调用addStatusBarWindow()方法
private void addStatusBarWindow() {
makeStatusBarView();
mStatusBarWindowManager = new StatusBarWindowManager(mContext);
mRemoteInputController = new RemoteInputController(mStatusBarWindowManager);
mStatusBarWindowManager.add(mStatusBarWindow, getStatusBarHeight());
}
调用makeStatusBarView();方法,该方法调用后会生成信号栏的view,并且为这些信号的显示添加相应的控制对象。
在这里,创建了mMSimNetworkController对象。
PhoneStatusBarView makeStatusBarView() {
…
mMSimNetworkController = new MSimNetworkControllerImpl(mContext, mSignalThread.getLooper());
…
}
在MSimNetworkControllerImpl类的构造函数中,初始化了卡、信号以及数据的状态,并注册了状态变化的监听。
public MSimNetworkControllerImpl(Context context, Looper bgLooper) {
super(context, bgLooper);
initUIState();
mBackgroundHandler.post(new Runnable() {
@Override
public void run() {
registerPhoneStateListener(mContext);
}
});
registerBroadcastReceive(context);
resetVoLTEStateChangeObserver();
resetTurAccShowStateChangeObserver();
resetSimCardActiveStateChangeObserver();
resetAirplaneChangeObserver();
}。