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 赋予开发者更细粒度的控制,避免“启动白屏/卡顿”问题,同时提供一致的视觉体验。