Android 12开始应用冷启动和温启动时,系统会默认先加载SplashScreen(如下布局)
,然后在应用Activity渲染第一帧得时候移除;
<android.window.SplashScreenView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<View android:id="@+id/splashscreen_icon_view"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center"
android:contentDescription="@string/splash_screen_view_icon_description"/>
<View android:id="@+id/splashscreen_branding_view"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="60dp"
android:contentDescription="@string/splash_screen_view_branding_description"/>
</android.window.SplashScreenView>
SplashScreenView继承于FrameLayout,布局中包含一个居中的应用图标和一个置底的品牌图标。对应的配置,需要用到SDK 31新增的window属性:
设置启动页窗口填充内容(drawable),此drawable将会放置在windowBackground之上,且会缩放至保证边界在可视窗口范围内(受系统栏影响);
如果不希望显示系统栏,请使用全屏主题。
请注意,即使主题上没有设置windowSplashscreenContent,系统仍会使用其他属性配置启动页画面,
如windowBackground、windowSplashscreenAnimatedIcon。
<item name="android:windowSplashscreenContent" format="reference" />
设置启动页背景颜色,如果不指定,则系统将使用windowBackground。
<item name="android:windowSplashScreenBackground" format="color" />
设置启动页图标,图标在页面中心显示,如果资源为可执行动画的drawable,(如AnimationDrawable, AnimatedVectorDrawable)
则在展示启动页的同时会执行动画
<item name="android:windowSplashScreenAnimatedIcon" format="reference" />
设置启动页图标动画时间,单位毫秒,最大时长不超过1000ms。
<item name="android:windowSplashScreenAnimationDuration" format="integer" />
设置启动页底部品牌图,它可用来表示应用程序的生产商品牌。
<item name="android:windowSplashScreenBrandingImage" format="reference" />
设置启动页图标背景颜色,当图标颜色与窗口背景色差别不大时,设置此属性非常必要;
注意此背景图形会与图标一样,被UI遮罩裁剪。
<item name="android:windowSplashScreenIconBackgroundColor" format="color" />
上面提到的UI遮罩是Google为了解决各厂商对应用图标圆角不同,而导致图标不美观或者需要多套图标的问题,从Android 8.0开始,将应用图标拆分成背景,图标,遮罩3部分组合;

由于我们经常会在启动该页进行一些初始化或接口请求,所以需要在此页面停留超过1000ms,此时可以通过暂停activity渲染来达到延长显示。
final View content = findViewById(android.R.id.content);
ViewTreeObserver.OnPreDrawListener preDrawListener=new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
// checkReady-->检查是否关闭SplashView
if (checkReady()) {
content.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
} else {
return false;
}
}
};
content.getViewTreeObserver().addOnPreDrawListener(preDrawListener);
如果应用图标动画时长1000ms不够用,可以添加动画结束监听,在默认动画结束后获取SplashScreenView进行操作;需要注意getSplashScreen是SDK 31后在Activity中新增的方法。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
getSplashScreen().setOnExitAnimationListener(new SplashScreen.OnExitAnimationListener() {
@Override
public void onSplashScreenExit(@NonNull SplashScreenView view) {
//对SplashScreenView进行操作
//使用SplashScreenView.getIconAnimationStart获取动画开始时间
}
});
}
使用AndroidX提供的兼容包向下兼容
- 添加依赖'androidx.core:core-splashscreen:1.0.0-alpha02'
查看androidx最新版本 - 修改主题文件
将‘android:’去掉,使用androidx兼容包中提供的属性,设置SplashView移除后Activity的样式‘postSplashScreenTheme’
<item name="windowSplashscreenContent" format="reference">…</>
<item name="windowSplashScreenBackground" format="color">…</>
<item name="windowSplashScreenAnimatedIcon" format="reference">…</>
<item name="windowSplashScreenAnimationDuration" format="integer">…</>
<item name="windowSplashScreenBrandingImage" format="reference">…</>
<item name="windowSplashScreenIconBackgroundColor" format="color">…</>
<item name="postSplashScreenTheme">…</item><!--必填,SplashView移除后使用此主题恢复Activity样式-->
- 在启动Activity的onCreate调用installSplashScreen
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SplashScreen.installSplashScreen(this);
}
目前存在的问题:
- 不支持设置品牌图标
- 遮罩圆角固定为图标尺寸1/3,Android 12以下不同手机圆角不固定,可能造成显示不同
2022-02-17
网友评论