봄날은 갔다. 이제 그 정신으로 공부하자

Splash Screen이란? 본문

android Tip

Splash Screen이란?

길재의 그 정신으로 공부하자 2022. 2. 16. 22:22

Splash Screen이란?

많은 Android앱들이 다양한 기능을 지원하고 또 점점 많은 라이브러리를 탑재하다보니 앱의 사이즈가 커져 사용자가 앱을 실행하기 위해 엡 아이콘을 눌러 실제 앱이 실행되는데까지 시간이 걸리는데 이때 사용자에게 첫화면이 보여지기 전까지 자연스럽게 노출되는 화면으로 Android 12에서는 모든 앱에 새로운 앱 실행 애니메이션을 사용하는 SplashScreen API를 지원합니다.

 

 

android는 앱 실행을 아래와 같이 3가지(Cold Start, Warm Start, Hot Start)로 구분 할 수 있으며, Splash Screen은 아래 3가지 앱 실행 상태 중 "Cold Start"와 "Warm Start"일때만 동작합니다.

  • Cold Start: 앱이 처음부터 실행되는 것으로 제일 많은 시간이 소요됨.
  • Warm Start: Cold Start보다는 빠르고 Hot Start 보다는 느림. 
  • Hot Start: 앱이 실행되어 메모리에 있는 상태로 포그라운드로 가져오기만 하면 되는 상태로 매우 빠름.

 

Android 12 단말에서 앱을 실행해보면 개발자가 앱에 별도의 처리를 하지 않아도 자동으로 Splash Screen이 표시되는 것을 알 수 있는데 이렇게 자동으로 표시되는 것은 흰 배경 가운데에 앱 아이콘만 표시되는 기본 표현이므로 이걸 앱에 맞게 커스터마이징하고자 한다면 아래와 같은 처리가 필요합니다.

 

[Step 1] build.gradle에 Splash Screen 추가하기

Splash Screen을 추가하기 위해서는 compileSdk와 targetSdk가 31로 설정한 후 dependencides에 아래와 같이 splashscreen 라이브러리를 추가해 주어야 합니다.

단, splashscreen을 추가하기 위해서는 minSdk가 최소 21이상이어야 합니다.

android {
    compileSdk 31

    defaultConfig {
        ...
        minSdk 21
        targetSdk 31
        ...
    }
    ...

dependencies {
    ...
    implementation 'androidx.core:core-splashscreen:1.0.0-beta01'
}

 

[Step 2] themes.xml에 splashscreen 테마 추가하기

아래와 같이 splashscreen의 테마를 추가해 줍니다.

<style name="Theme.MySplashScreen.Splash" parent="Theme.SplashScreen">
    <item name="windowSplashScreenBackground">@color/purple_500</item>
    <item name="windowSplashScreenAnimatedIcon">@drawable/splash_icon</item>
    <item name="windowSplashScreenAnimationDuration">200</item>
    <item name="postSplashScreenTheme">@style/Theme.MySplashScreen.NoActionBar</item>
</style>

 

각 구성 요소에 대한 설명은 다음과 같습니다.

  • windowSplashScreenBackground: splashscreen의 배경
  • windowSplashScreenAnimatedIcon: splashscreen에 표시할 이미지
  • windowSplashScreenAnimationDuration: splashscreen이 표시되는 시간으로 최대 1,000ms 
  • postSplashScreenTheme: splashscreen 처리가 끝나고 전환될 Theme

 

간혹 splashscreen을 적용한 후 앱을 빌드하면 아래와 같은 에러가 발생하는 경우가 있는데 이는 layout.xml에서 사용하는 화면 구성 요소 중 일부를 splashscreen 테마에서 미지원해서 발생하는 문제로 이러한 문제를 해결하기 위해 splashscreen 처리가 끝나고 전환될 Theme를 지정하는 postSplashScreenTheme를 사용해 전환된 테마를 명시해야 합니다.

Caused by: android.view.InflateException: Binary XML file line #12 in com.00000000.mysplashscreen:layout/activity_main: Binary XML file line #12 in com.00000000.mysplashscreen:layout/activity_main: Error inflating class com.google.android.material.appbar.AppBarLayout
Caused by: android.view.InflateException: Binary XML file line #12 in com.00000000.mysplashscreen:layout/activity_main: Error inflating class com.google.android.material.appbar.AppBarLayout

 

[Step 3]  drawable에 splash_icon.xml 추가하기

drawable에 아래와 같이 splash_icon을 추가해 줍니다.

이미지는 최대 108dp까지만 표시되므로 이미지의 사이즈는 108dp 이하로 설정해야 합니다.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:width="108dp"
        android:height="108dp"
        android:drawable="@mipmap/ic_launcher"
        android:gravity="center" />
</layer-list>

 

[Step 4]  AndroidManifest.xml에 splashscreen 테마 추가하기

최초 실행되는 activity의 테마를 아래와 같이 splashscreen로 변경해줍니다.

<activity
    android:name=".MainActivity"
    android:exported="true"
    android:label="@string/app_name"
    android:theme="@style/Theme.MySplashScreen.Splash">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

 

[Step 5]  splashscreen 사용을 위해 초기화하기

splashscreen을 사용하기 위해서는 최초 사용하는 activity에 아래와 같이 splashscreen을 초기화하는 함수를 호출해주어야 합니다.

그렇지 않을 경우, 앱이 실행 될 때 splashscreen이 표시되지 않습니다.

class MainActivity : AppCompatActivity() {

    private lateinit var appBarConfiguration: AppBarConfiguration
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        installSplashScreen()
        super.onCreate(savedInstanceState)
        ...	
    }
    ...
}

 

정리

Android 12에서 개발자가 직접 splashscreen을 제어해서 사용하기 위해서는 아래와 같은 순서로 처리가 필요합니다.

  1. build.gradle splashscreen 추가하기
  2. splashscreen 테마 추가하기
  3. 테마에 사용할 아이콘 추가하기
  4. splashscreen 사용할 Activity 테마 추가하기
  5. splashscreen 초기화하기
Comments