SystemUI一直都是andorid系统中重要的组成部分,针对它的分析网上例子也非常多,但主要是较早期版本。目前工作中经常遇到关于的它内容,于是就对它的流程做一个浅要分析,作为自己学习的心得体会。以下内容针对的是6.0系统。关于SystemUI里面细节知识点非常多,无法将所有内容分析到位,不足之处还请指正。
SystemUI中包含状态栏(StatusBar)和导航栏(NavigationBar)。状态栏中主要用来显示信号,蓝牙标志,Wifi等信息,由于状态栏需要实时反馈系统的状态给用户,所以它必须常驻系统内存中。Andriod中能够长期存在的只有服务(service),所以SystemUI也是有服务管理。
在andorid系统中SystemUI是由SystemUIService启动的,而SystemUIService又是SystemServer启动的。当android系统初始化完成后,SystemServer就会被启动。关于代码路径位于:frameworks/base/packages/SystemUI
现在来分析SystemUI的启动流程:
如上所述,通过SystemServer来启动SystemUIService,
源码地址:
frameworks/base/services/java/com/android/server/SystemServer.java
/**
*调用该程序的入口
*/
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
//Start services.
startBootstrapServices();
startCoreServices();
startOtherServices();
。。。。。
}
//在SystemServer加载时,通过该静态方法启动SystemUIService服务;
static final void startSystemUi(Context context) {
Intent intent= new Intent();
intent.setComponent(newComponentName("com.android.systemui",
"com.android.systemui.SystemUIService"));
//Slog.d(TAG,"Starting service: " + intent);
context.startServiceAsUser(intent,UserHandle.OWNER);
}
源码地址:
frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java
//当SystemUIService启动完成后,就会执行startServicesIfNeeded();
@Override
public void onCreate() {
super.onCreate();
((SystemUIApplication)getApplication()).startServicesIfNeeded();
}
//在这个方法中,就会启动所有的在SystemUI中需要启动的服务;
public void startServicesIfNeeded() {
//开始启动里面继承SystemUI的services
//KeyguardViewMediator
//Recents
//VolumeUI
//SystemBars
//StorageNotification
//PowerUI
//RingtonePlayer
mServices[i].start();
}