SystemUI启动流程
来源:互联网 发布:java查看内存使用情况 编辑:程序博客网 时间:2024/06/11 02:14
init -> ServerManager -> Zygote -> SystemServer -> SystemUIService -> SystemUIApplication
SystemServer启动后,会在SystemServer Main Thread启动ActivityManagerService,当ActivityManagerService systemReady后,会去启动SystemUIService。可以看出,startSystemUi不是在SystemServer Main thread,而是在ActivityManagerService Thread。
\frameworks\base\services\java\com\android\server\SystemServer.java
/** * Starts a miscellaneous grab bag of stuff that has yet to be refactored * and organized. */private void startOtherServices() { if (!disableSystemUI) { try { Slog.i(TAG, "Status Bar"); statusBar = new StatusBarManagerService(context, wm); ServiceManager.addService(Context.STATUS_BAR_SERVICE, statusBar); } catch (Throwable e) { reportWtf("starting StatusBarManagerService", e); } } mActivityManagerService.systemReady(new Runnable() { @Override public void run() { try { startSystemUi(context); } catch (Throwable e) { reportWtf("starting System UI", e); }static final void startSystemUi(Context context) { Intent intent = new Intent(); intent.setComponent(new ComponentName("com.android.systemui", "com.android.systemui.SystemUIService")); //Slog.d(TAG, "Starting service: " + intent); context.startServiceAsUser(intent, UserHandle.OWNER);
}
备注:
context.startServiceAsUser(…)调用的是\frameworks\base\core\java\android\app\ContextImpl.java中的startServiceAsUser(…),而startServiceAsUser(…)调用startServiceCommon(…)
SystemServer在startSystemUi启动SystemUIService后,会走到SystemUIService的onCreate函数。
public class SystemUIService extends Service {
@Override
public void onCreate() {
super.onCreate();
((SystemUIApplication) getApplication()).startServicesIfNeeded();
} /* 这个SystemUIService很短,代码不到60行 */
可见SystemUIService调用了SystemUIApplication的startServicesIfNeeded()。
\frameworks\base\packages\SystemUI\src\com\android\systemui\ SystemUIApplication.java
/**
* Application class for SystemUI.
*/
public class SystemUIApplication extends Application {
private static final String TAG = "SystemUIService";private static final boolean DEBUG = false;/** * The classes of the stuff to start. */private final Class<?>[] SERVICES = new Class[] { com.android.systemui.keyguard.KeyguardViewMediator.class, // 锁屏机制 com.android.systemui.recent.Recents.class, // 近期任务 com.android.systemui.volume.VolumeUI.class, // 音量UI com.android.systemui.statusbar.SystemBars.class, // 系统栏 com.android.systemui.usb.StorageNotification.class, // 存储信息通知 com.android.systemui.power.PowerUI.class, // 电源UI com.android.systemui.media.RingtonePlayer.class // 铃声播放}; // 它们并不是真正的Service ,继承了SystemUI.java这个抽象类,复写了start()方法/** * Hold a reference on the stuff we start. */private final SystemUI[] mServices = new SystemUI[SERVICES.length];private boolean mServicesStarted;private boolean mBootCompleted;private final Map<Class<?>, Object> mComponents = new HashMap<Class<?>, Object>();@Overridepublic void onCreate() { super.onCreate(); // Set the application theme that is inherited by all services. Note that setting the // application theme in the manifest does only work for activities. Keep this in sync with // the theme set there. setTheme(R.style.systemui_theme); // 注册开机广播 IntentFilter filter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED); filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (mBootCompleted) return; if (DEBUG) Log.v(TAG, "BOOT_COMPLETED received"); unregisterReceiver(this); mBootCompleted = true; if (mServicesStarted) { final int N = mServices.length; for (int i = 0; i < N; i++) { mServices[i].onBootCompleted(); } } } }, filter);}/** * Makes sure that all the SystemUI services are running. If they are already running, this is a * no-op. This is needed to conditinally start all the services, as we only need to have it in * the main process. * * <p>This method must only be called from the main thread.</p> */public void startServicesIfNeeded() { if (mServicesStarted) { return; } if (!mBootCompleted) { // check to see if maybe it was already completed long before we began // see ActivityManagerService.finishBooting() if ("1".equals(SystemProperties.get("sys.boot_completed"))) { mBootCompleted = true; if (DEBUG) Log.v(TAG, "BOOT_COMPLETED was already sent"); } } Log.v(TAG, "Starting SystemUI services."); final int N = SERVICES.length; // for循环逐个启动SystemUI的各个服务(电源UI、音量UI、状态栏等) for (int i=0; i<N; i++) { Class<?> cl = SERVICES[i]; if (DEBUG) Log.d(TAG, "loading: " + cl); try { mServices[i] = (SystemUI)cl.newInstance(); } catch (IllegalAccessException ex) { throw new RuntimeException(ex); } catch (InstantiationException ex) { throw new RuntimeException(ex); } mServices[i].mContext = this; mServices[i].mComponents = mComponents; if (DEBUG) Log.d(TAG, "running: " + mServices[i]); mServices[i].start(); // 调用各个”服务”的start()方法 if (mBootCompleted) { mServices[i].onBootCompleted(); } } mServicesStarted = true;}@Overridepublic void onConfigurationChanged(Configuration newConfig) { if (mServicesStarted) { int len = mServices.length; for (int i = 0; i < len; i++) { mServices[i].onConfigurationChanged(newConfig); } }}@SuppressWarnings("unchecked")public <T> T getComponent(Class<T> interfaceType) { return (T) mComponents.get(interfaceType);}// 暴露的接口public SystemUI[] getServices() { return mServices;}
}
下面看SystemBars.java的start()方法
@Override
public void start() {
if (DEBUG) Log.d(TAG, “start”);
mServiceMonitor = new ServiceMonitor(TAG, DEBUG,
mContext, Settings.Secure.BAR_SERVICE_COMPONENT, this);
mServiceMonitor.start(); // will call onNoService if no remote service is found
}
\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\ServiceMonitor.java
public ServiceMonitor(String ownerTag, boolean debug,
Context context, String settingKey, Callbacks callbacks) {
mTag = ownerTag + “.ServiceMonitor”;
mDebug = debug;
mContext = context;
mSettingKey = settingKey;
mCallbacks = callbacks;
}
public void start() { // listen for setting changes ContentResolver cr = mContext.getContentResolver(); cr.registerContentObserver(Settings.Secure.getUriFor(mSettingKey), false /*notifyForDescendents*/, mSettingObserver, UserHandle.USER_ALL); // listen for package/component changes IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_PACKAGE_ADDED); filter.addAction(Intent.ACTION_PACKAGE_CHANGED); filter.addDataScheme("package"); mContext.registerReceiver(mBroadcastReceiver, filter); mHandler.sendEmptyMessage(MSG_START_SERVICE);}
init -> ServerManager -> Zygote -> SystemServer -> SystemUIService -> SystemUIApplication
状态栏启动:
SystemUIApplication -> SystemBars
SystemBars里面createStatusBarFromConfig() {
……
String clsName = mContext.getString(R.string.config_statusBarComponent);
……
cls = mContext.getClassLoader().loadClass(clsName);
……
mStatusBar = (BaseStatusBar) cls.newInstance();
……
mStatusBar.start();
}
config_statusBarComponent在frameworks\base\packages\SystemUI\res\values\config.xml中定义:
com.android.systemui.statusbar.phone.PhoneStatusBar
由此可见,SystemBars里面启动的就是PhoneStatusBar了,PhoneStatusBar继承BaseStatusBar。由Java多态性,mStatusBar.start()实际上就是PhoneStatusBar.start()。下面看一下PhoneStatusBar.start()这个函数的函数体:
@Override
public void start() {
……
super.start(); // calls createAndAddWindows()
// 添加导航栏
addNavigationBar();
}
super.start()也就是BaseStatusBar.start(),里面调用了createAndAddWindows(),但这是一个抽象函数,因此会回调至子类PhoneStatusBar的createAndAddWindows(),下面看一下PhoneStatusBar的createAndAddWindows()函数:
@Override
public void createAndAddWindows() {
……
addStatusBarWindow();
……
}
private void addStatusBarWindow() {
makeStatusBarView();
mStatusBarWindowManager = new StatusBarWindowManager(mContext);
mStatusBarWindowManager.add(mStatusBarWindow, getStatusBarHeight());
}
- 5.0systemUI启动流程
- SystemUI启动流程
- SystemUI启动流程
- android SystemUI浅析之SystemUI启动流程
- android4.0 systemui启动流程
- Android4.4 systemui 启动流程
- Android5.1 SystemUI 启动流程
- Android 4.0 ICS SystemUI浅析——SystemUI启动流程
- Android 4.0 ICS SystemUI浅析——SystemUI启动流程
- Android 4.0 ICS SystemUI浅析——SystemUI启动流程
- Android 4.0 ICS SystemUI浅析——SystemUI启动流程
- Android 4.0 ICS SystemUI浅析——SystemUI启动流程
- Android 4.0 ICS SystemUI浅析——SystemUI启动流程
- Android 4.0 ICS SystemUI浅析——SystemUI启动流程
- Android 4.0 ICS SystemUI浅析——SystemUI启动流程
- Android 4.0 ICS SystemUI浅析——SystemUI启动流程
- Android 4.0 ICS SystemUI浅析——SystemUI启动流程
- Android 4.0 ICS SystemUI浅析——SystemUI启动流程
- RTP/RTCP协议解析
- popwindow显示在控件左方
- android中Zxing实现二维码功能的快速集成以及扫描界面的定制
- JavaScript 生日下拉
- JS 判断是否手机号码
- SystemUI启动流程
- pods symbol(s) not found for architecture XXX
- 图解集合6:LinkedHashMap
- canalserver1.0.22基于mariadb10.1.14的HA功能bug
- 根目录磁盘空间不足
- 安卓高级4 第三方库SlidingMenu的使用
- 54. Cache-Control
- Java线程安全和非线程安全
- JavaScript地区选择