Android 12之启动画面Splash Screens(二) -- framework原理

本文详细剖析了Android 12中启动画面Splash Screens的框架层原理,包括SplashScreenView的创建、添加流程,系统启动与Activity启动的联动,以及SystemUI中WMShell组件的作用。深入讲解了关键方法如addSplashScreenStartingWindow和handleAttachSplashScreenView的工作机制。

上篇介绍应用端适配Splash Screens的流程:Android 12之启动画面Splash Screens (一) – 适配,本篇介绍Splash Screens的framework层原理,基于Android12L进行分析,对比Android12有些许变化但流程一致。

系统中创建并预绘制启动画面的流程

SplashScreenView创建与添加流程的时序图如下:
在这里插入图片描述
方法调用流程如下:

Task.startActivityLocked—>
StartingSurfaceController.showStartingWindow—>
ActivityRecord.showStartingWindow—>addStartingWindow—>scheduleAddStartingWindow
—>ActivityRecord.AddStartingWindow.run—>
StartingData.createStartingSurface—>
SplashScreenStartingData.createStartingSurface—>
StartingSurfaceController.createSplashScreenStartingSurface—>
TaskOrganizerController.addStartingWindow—>
TaskOrganizer.addStartingWindow—>
StartingWindowController.addStartingWindow—>
StartingSurfaceDrawer.addSplashScreenStartingWindow—>
SplashscreenContentDrawer.createContentView—>makeSplashScreenContentView—>
StartingWindowViewBuilder.build()—>fillViewWithIcon—SplashScreenView.Builder.build—>SplashScreenView—>
StartingSurfaceDrawer.SplashScreenViewSupplier.setView—>
StartingSurfaceDrawer.addWindow—>
WindowManagerGlobal.addView—>
ViewRootImpl.setView—>IWindowSession.addToDisplayAsUser—>
WindowManagerService. addToDisplay—>addWindow—>
rootLayout.addView

整个流程就是LauncherActivityTaskManagerServiceActivityTaskManagerService通知SystemUI创建SplashScreenViewSystemUIaddWindow通过WMS添加画面的过程。

startActivity的流程

时序图如下:
在这里插入图片描述

Task.startActivityLocked()之前的流程就是Activity.startActivity()进行的流程,方法调用流程如下(承接上述流程):

Activity.startActivity—>startActivityForResult—>
Instrumentation.execStartActivity—>
ActivityStartController.startActivity—>startActivityAsUser—>
getActivityStartController().obtainStarter().execute—>
ActivityStarter.execute—>executeRequest—>startActivityUnchecked—>startActivityInner—>
Task.startActivityLocked—>
StartingSurfaceController.showStartingWindow—>

同时Activity.startActivity()ActivityManagerService发起请求处理startActivity,ActivityManagerService调用ProcessList.startProcess(),通过SocketZygote进程请求创建应用进程。

SystemUI相关组件WMShell

在添加启动画面的过程中,会进入到 SystemUI进程进行一些特殊处理,主要涉及到SysUI的WMShell组件。SystemUI为系统处理各种业务逻辑的关键代码,包含有20多个组件,从中可以看出 SystemUI的复杂程度。其中的WMShell也是复杂多样的,其中SplitScreen分屏模式、OneHanded单手模式、Freeform自由窗口模式、Bubble气泡通知窗口(Android Q)、PIP画中画模式等等系统模式窗口为WMShell处理的一部分,SystemUI引用framework的系统库,通过Dagger2依赖注入,将WMComponent,WMShellModule、WMShellBaseModule整合构建出StartingWindowController、ShellTaskOrganizer、StartingSurfaceDrawer等实例实现启动画面的过渡作用。
方法初始化调用流程如下:

SystemUIFactory.init—>
WMComponent.default init—>getShellInit().init()
InitImpl.init—>
ShellInitImpl.init—>
ShellTaskOrganizer.registerOrganizer()—>
TaskOrganizer.registerOrganizer—>
TaskOrganizerController.registerTaskOrganizer(ITaskOrganizer)—>mTaskOrganizers.add(organizer)

初始化后将ShellTaskOrganizer注册到ActivityManagerTaskServiceTaskOrganizerController的列表中,``ActivityManagerTaskService调用的TaskOrganizer即为ShellTaskOrganizer```,与SystemUI夸进程通信。

addSplashScreenStartingWindow方法的添加流程

StartingSurfaceDrawer.addSplashScreenStartingWindow源码添加SplashScreenView的过程中,代码如下:

    void addSplashScreenStartingWindow(StartingWindowInfo windowInfo, IBinder appToken,
            @StartingWindowType int suggestType) {
   
   
        final SplashScreenViewSupplier viewSupplier = new SplashScreenViewSupplier();
        final FrameLayout rootLayout = new FrameLayout(
                mSplashscreenContentDrawer.createViewContextWrapper(context));
        rootLayout.setPadding(0, 0, 0, 0);
        rootLayout.setFitsSystemWindows(false);
        final Runnable setViewSynchronized = () -> {
   
   
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言并肃

感谢大哥支持!您的鼓励是我动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值