본문 바로가기
Android/Android 핵심기술

[Android/Kotlin] splashscreen 화면 구현하기

by juwon2 2025. 4. 21.

 

 

 

예전에 splash화면 띄우는 작업을 한적있었는데, 그때는 SplashActivity를 새로 하나 만든다음에 AndroidManifest에서 SplashActivity에다가 intent-fileter를 적용해주는 방식으로 진행했었다.

그치만 이방법은 SplashActivity를 하나 더 생성해야했고, 레이아웃을 또 디자인해야된다는 번거로움이 있었다.

 

찾아보니깐 Material3 방식 SplashScreen을 사용하면 Activity를 따로 생성할 필요없이 아이콘만 지정해주면 가운대에 해당 아이콘이 뜨도록 할 수 있었다.

 

 

먼저 의존성을 추가해준다

build.gradle.kts(app)

// Splashscreen
    implementation ("androidx.core:core-splashscreen:1.0.0")

 

 

 

themes.xml

테마에 들어가서 splashscreen관련 속성을 정의해준다

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Base.Theme.Jikimi" parent="Theme.Material3.DayNight.NoActionBar">
        <!-- Customize your light theme here. -->
        <item name="colorPrimary">@color/white</item>
        <item name="android:statusBarColor">@color/white</item>
        <item name="android:windowLightStatusBar">true</item>

    </style>

    <style name="Theme.Jikimi" parent="Base.Theme.Jikimi" />

    <!-- floating action button 원형으로-->
    <style name="FloatingActionButton" parent="">
        <item name="cornerFamily">rounded</item>
        <item name="cornerSize">32dp</item>
    </style>

    <!--splash 화면-->
    <style name="Theme.App.Splash" parent="Theme.SplashScreen">
        <item name="windowSplashScreenBackground">@color/background_pink</item> <!--배경색-->
        <item name="windowSplashScreenAnimatedIcon">@drawable/splash</item>
        <item name="windowSplashScreenAnimationDuration">500</item>
        <item name="postSplashScreenTheme">@style/Theme.Jikimi</item>
    </style>

</resources>

 

windowSplashScreenBackground

-> 배경색 단색으로 설정

windowSplashScreenAnimationDuration -> 스플래시 화면 아이콘 애니메이션의 지속 시간 설정

windowSplashScreenIconBackgroundColor -> 스플래시 화면 아이콘 뒤의 배경을 설정 (창 배경과 아이콘 사이에 대비가 충분하지 않은 경우에 유용)

windowSplashScreenBrandingImage -> 스플래시 화면 하단에 표시되도록 이미지를 설정(브랜드 네임 이미지 표시같은거) / 그러나 디자인 가이드라인에서는 브랜드 이미지 사용을 권장하지 않음

windowSplashScreenBehavior -> Android 13 이상에서 앱이 항상 스플래시 화면에 아이콘을 표시할지 여부를 지정

빈 스플래시 화면을 표시하지 않고 항상 애니메이션 아이콘을 표시하려면 이 값을 icon_preferred로 설정

<item name="android:windowSplashScreenBehavior">icon_preferred</item>

 

 

이제 Menifest로 가서 application이나 activity부분에 아래와 같이 코드를 작성해준다. (theme에 지정해준 splashscreen속성의 이름으로 설정해줌)

<manifest>
   <application android:theme="@style/Theme.App.Splash">
    <!-- or -->
        <activity android:theme="@style/Theme.App.Splash">
...

 

나는 activtiy부분에 아래와같이 작성해줬다.

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

 

 

 

 

MainActiviy.kt

그런다음 최종적으로 MainActiviy에 가서 splashScreen을 실행하기위해 installSplashScren()함수를 실행시켜줘야한다.

근데 여기서 주의해야될점이 MainAcivity가 onCreate되기전에 splash가 실행되야되기 때문에 Oncreate되기전에 해당 함수를 작성해줘야된다!!!

난 onCreate이후에 작성해버렸더니 오류가 발생하면서 앱이 종료되는 문제가 발생했다ㅠ

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private lateinit var navController: NavController

    override fun onCreate(savedInstanceState: Bundle?) {
        // splashScreen 실행
        installSplashScreen()

        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        setupNavigation()
    }


    private fun setupNavigation() {
        val navHostFragment = supportFragmentManager.findFragmentById(R.id.fcv_main) as NavHostFragment
        navController = navHostFragment.navController

        // BottomNavigation 설정
        binding.bottomNavBar.setupWithNavController(navController)

        // bottomNavBar 선택했을 때 해당뷰로 이동
        binding.bottomNavBar.setOnItemSelectedListener { item ->
            NavigationUI.onNavDestinationSelected(item, navController)
            true
        }
    }

    fun hideBottomNavigation() {
        binding.bottomNavBar.visibility = View.GONE
    }

    fun showBottomNavigation() {
        binding.bottomNavBar.visibility = View.VISIBLE
    }

}

 

 

이렇게 코드를 작성해주면 따로 SplashActivty를 생성하지않고 스플래쉬화면을 구성할 수 있다는 장점이 있다.

그치만 아직은 해당 SplashScreen API는 아이콘과 브랜드네임을 표시하는 기능밖에 없기때문에 스플래쉬화면을 복잡하게? 만들어야하는 상황이면 따로 SplashActivty를 만들어야될것같다.

구현해야하는 상황에따라 더 적합한 방법으로 구현하면 될것같다.

 

 

 

참고 공식문서 보면 아이콘 규격사항이 나와있어서 피그마로 맞춰서 제작해주니 이쁘게 아이콘이 나온다

 

 

https://developer.android.com/develop/ui/views/launch/splash-screen?hl=ko#kts

 

스플래시 화면  |  Views  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 스플래시 화면 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 중요: Android 11 이하에서 맞춤 스플래시

developer.android.com

 

https://developer.android.com/develop/ui/views/launch/splash-screen/migrate?hl=ko

 

스플래시 화면 구현을 Android 12 이상으로 이전  |  Views  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 스플래시 화면 구현을 Android 12 이상으로 이전 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android 11

developer.android.com