System UI学习笔记(二)

System UI学习笔记(二)

既然我需要学习System UI,那么我想知道这个UI是怎么启动的?

前面了解到,这没有入口activity,是通过服务启动的。

frameworks/base/servicesjava/com/android/server/SystemServer.java(下面的服务路径)

SystemUIService服务进程启动,那么我们看一下SystemServer的源码(一开始我在SystemUI里面没找到,才发现压根不在里面哈哈哈哈)。

上面这个run()方法会一次启动Android系统服务,通过了解,AMS是在startOtherServices()方法中启动,那么我们来看一下源码(代码块):

展示代码
mActivityManagerService.systemReady(() -> {
          ...省略代码
            t.traceBegin("StartSystemUI");
            try {
                startSystemUi(context, windowManagerF);/* 核心启动代码*/
            } catch (Throwable e) {
                reportWtf("starting System UI", e);
            }
            t.traceEnd();
    ...省略代码

其次,在AMS启动完成后,回调systemReady如上,在其中调用startSystemUI()方法启动了SystemUI。

   private static void startSystemUi(Context context, WindowManagerService windowManager) {
        PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);
        Intent intent = new Intent();
        intent.setComponent(pm.getSystemUiServiceComponent());
        intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
        //Slog.d(TAG, "Starting service: " + intent);
        context.startServiceAsUser(intent, UserHandle.SYSTEM);
        windowManager.onSystemUiStarted();
    }

SystemUIService逻辑也是比较简单的,启动之后主要调用SystemUIApplication的startServicesIfNeeded()方法。

了解了SystemUI是怎么启动的之后,我们想知道通知视图是怎么跨进程显示,带着这个疑问,我们在继续学习了解一下。😍

 

posted @ 2022-06-20 16:51  include_chen  阅读(198)  评论(0编辑  收藏  举报