[Android] Android 12 Splash Screen 구현
기존 Splash Screen
기존 Android Splash Screen 구현 방법을 Velog에 기록한 적이 있다. App Theme를 Splash Theme를 적용하고 MainActivity에서 Theme를 복구하는 방식으로 구현했었는데, Android 12에서 Splash Screen 구현을 제공해주고 호환을 하려면 migrate 진행이 필요하다.
Migrate를 진행하지 않으면 Android 12 이상부터는 cold start나 warm start 상태에서는 기본 스플래시 스크린 표시한다. 기본 스플래시 스크린은 windowBackground 색상과 Launcher 아이콘을 활용해 스플래시 스크린을 그린다.
Velog에 쓴 방식대로 구현하면 Android 12 이상부터는 기본 스플래시 스크린을 그린다. 만약, Activity 시작 시 자체 적인 스플래시 스크린을 구현하였다면 Android 12 이상부터 2개의 스플래시 스크린이 각각 노출되거나 기대와 다른 동작의 가능성이 있어서 점검이 필요하다.
공식문서 가이드에 따라 Migrate를 진행해본다.
코드만 확인하고 싶다면 Jumo Android 의 PR에서 확인 가능하다.
Build.gradle
build.gradle에 splash_screen_version은 링크에서 확인한 뒤 core-splashscreen을 추가한다.
implementation "androidx.core:core-splashscreen:$splashscreen_version}"
Theme.xml
velog에 있는 글대로 구현을 한 상태라면 style에 추가한 SplashTheme를 변경해주는 것이 필요하다.
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/splash</item>
</style>
windowSplashScreenBackground
에 원하는 배경색상을 사용하고 (velog에서는 android color를 사용한 상태) postSplashScreenTheme
에 앱 기본 테마를 명시하면 된다. style이름은 공식문서 형태를 따라서 활용한 상태이다.
<style name="Theme.App.Splash" parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">@android:color/background_dark</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/splash_icon</item>
<item name="windowSplashScreenAnimationDuration">200</item>
<item name="postSplashScreenTheme">@style/Theme.App</item>
</style>
windowSplashScreenBackground: 배경 색상을 지정한다.
windowSplashScreenAnimatedIcon: 표시할 아이콘 값을 명시한다. 중앙정렬되며 자동으로 원형의 영역이 잡혀있다. 주의 사항은 108dp 보다 큰 경우 이미지는 자동으로 짤린다.
windowSplashScreenAnimationDuration: 아이콘 애니메이션 duration 설정값이지만 애니메이션 자체에는 직접적인 영향을 주진 않는다.
postSplashScreenTheme: 스플래시 완료 후 설정하려는 Theme로 일반적으로는 앱 기본 테마값을 설정하면 된다.
icon 크기는 layer-list를 활용해 관리한다면 원하는 형태로 관리가 쉽고 추후 애니메이션 로고로 변경 시에도 관리가 편하다.
splash_icon.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:width="108dp"
android:height="108dp"
android:drawable="@drawable/ic_launcher"
android:gravity="center" />
</layer-list>
AndroidManifest.xml
manifest의 application의 theme를 추가한 Theme.App.Splash 으로 변경한다.
<manifest>
<application android:theme="@style/Theme.App.Splash">
...
MainActivity
App 실행 후 첫 실행되는 Activity의 onCreate에 installSplashScreen()을 추가하면 된다.
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
val splashScreen = installSplashScreen()
super.onCreate(savedInstanceState)
...
installSplashScreen 를 추가하지 않으면 MainActivity가 실행되지 않거나 Theme 전환이 정상적으로 진행되지 않는다. 증상이 궁금하면 installSplashScreen() 코드를 주석처리해보면 된다.
Branding 추가
*아래 내용은 Android 12 이상부터만 적용되어 테스트를 하려면 Android 12 이상이어야합니다.
android:windowSplashScreenBrandingImage를 Splash Theme에 item 추가 시 중앙 로고 외에 branding 이미지를 추가할 수 있다.
<style name="Theme.App.Splash" parent="Theme.SplashScreen">
...
<item name="android:windowSplashScreenBrandingImage" tools:targetApi="s">@drawable/splash_branding</item>
...
</style>
크기는 가로 200dp, 세로 80dp 이며 큰 경우 fitxy 느낌으로 출력한다. layer-list를 활용해 관리한다면 중앙정렬을 원하는 형태로 관리가 쉽다.
splash_branding.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/ic_branding"
android:gravity="center" />
</layer-list>