SystemUI是指“系统UI”,SystemUI是以应用程序的形式提供系统UI界面的统一管理方案,它是一个标准的APK。
本文将比较全面的介绍SystemUI的组成,实现,布局以及客制化方案等等。本博文基于android8.0源码进行分析,由于android8.0相比以前的版本SystemUI部分改动是非常大的。
一、SystemUI组成
SystemUI包含的功能非常丰富,组成元素主要包含常见的System Bars,以及ScreenShot截屏、壁纸、最近运行的应用程序等。SystemUI也是各大安卓版本中变化比较大的一个部分。
- Status Bar
- Navigation Bar
- Combined Bar (主要为Tablet设备使用)
- Notifications
- LockScreen
- Recent (最近任务)
- QuickSettings
- 等等
二、SystemUI实现
了解了SystemUI后,本文先来大概讲解下StatusBar的实现流程。
1、应用启动相关代码
相关代码主要分为两个部分
1)、Service部分
代码路径:framework/base/services/java/com/android/server
2) 、应用部分
代码路径:framework/base/packages/SystemUI
SystemUI中SystemUIService是整个系统UI比较重要的载体,所以我们的分析将从SystemUIService开始,而SystemUIService是从SystemServer中启动的。关于这部分这里不做多的分析,详见SystemServer.java中的startSystemUi()方法。下面来看一下SystemUIServer中的onCreate()方法。
/*framework/base/packages/systemui/src/com/android/systemui/SystemUIService.java*/
@Override
public void onCreate() {
super.onCreate();
((SystemUIApplication) getApplication()).startServicesIfNeeded();
// For debugging RescueParty
if (Build.IS_DEBUGGABLE && SystemProperties.getBoolean("debug.crash_sysui", false)) {
throw new RuntimeException();
}
}
上面的代码可以看出SystemUIService中实际有效代码只是实例化了一个SystemUIApplication对象,并且调用了startServiceIfNeeded()方法。下面来看SystemUIApplication中的具体实现逻辑。
public void startServicesIfNeeded() {
startServicesIfNeeded(SERVICES);
}
其中SERVICES是一组所有用户共用的SystemUI服务,如下:
/**
* The classes of the stuff to start.
*/
private final Class<?>[] SERVICES = new Class[] {
Dependency.class,
NotificationChannels.class,