StartWindow的官方增强版(解决黑白屏问题)

SplashScreen API 是对 StartWindow 的官方增强版,本质上是在 StartWindow 的机制之上,通过开放接口让开发者可以控制动画、图标、退出时机等,更好地解决启动黑/白屏问题,并统一用户体验。

核心结论:

SplashScreen API 并不是完全替代 StartWindow 的机制,而是基于它进行封装和扩展,使得应用启动阶段的过渡界面(StartWindow)更可控、更美观。

对比理解

特性 StartWindow(原生) SplashScreen API(Android 12+)
实现机制 系统在 WMS 中为 Activity 添加一个临时窗口 也是在 WMS 中创建窗口,但开放控制能力
控制能力 仅通过 theme 配置 提供 SplashScreen.installSplashScreen() 和动画控制等 API
支持动画 否(只能静态背景图) 是(setOnExitAnimationListener() 支持动画)
移除时机控制 系统内部控制,较固定 开发者可通过 setKeepOnScreenCondition() 控制
向下兼容 无法兼容旧系统 可使用 Jetpack 提供的 SplashScreenCompat 实现向下兼容

底层原理:还是通过 StartingWindow 实现

// frameworks/base/services/core/java/com/android/server/wm/StartingSurfaceController.java
StartingSurface addStartingWindow(ActivityRecord activityRecord) {
    // Android 12+ 会调用 SplashScreenViewSupplier 提供系统样式的 splash 窗口
}



// frameworks/base/core/java/com/android/app/SplashScreen.java
public static SplashScreen installSplashScreen(Activity activity) {
    ...
    return new SplashScreenImpl(...); // 里面会挂钩到 StartWindow 生命周期
}

• 本质还是用 WindowManagerService 提前插入了 StartingWindow;

• 只不过开放给应用一个控制“何时移除 + 如何动画退出”的能力。

小结一句话:

SplashScreen API 是 StartWindow 的升级版,它保留了原有机制的高性能(冷启动阶段系统级插入窗口),但通过新 API 赋予开发者更细粒度的控制,避免“启动白屏/卡顿”问题,同时提供一致的视觉体验。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器