[Android] Splash Screen 구현

heunghan·2020년 5월 25일
7

@Deprecated(" 아래 구현 방식에 맞춰 구현하더라도 스플래시 구현은 가능하지만, Android 12 등장 이후 개선된 방식이 아닙니다. Android 12 이후 개선 방식을 활용하여 Splash Screen을 적용하시려면 [Android] Android 12 Splash Screen 구현 에서 확인해주세요. ")

Android Splash Screen?

Splash Screen 은 일반적으로 앱이 실행될 때 나타나는 화면입니다.
YouTube 앱 실행 시 나오는 잠깐 로고화면이 나오고 앱 메인화면으로 진입되는데, 여기서 로고가 나온 화면이 Splash Screen 입니다.

이때 앱을 실행하면 나타나는 흰화면 혹은 검은화면을 실제 Splash Screen으로 띄워 개선하는 것이 목표입니다.

구현

결론인 구현방법부터 공유드리면 간단하게 Splash Theme를 적용하고 MainActivity에 접근하면 AppTheme를 띄우도록 설정하면 됩니다.
Github Commit

splash.xml 생성

/drawbale 에 splash.xml 을 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:drawable="@android:color/background_dark" />
  <item>
    <bitmap
      android:src="@drawable/ic_launcher"
      android:gravity="center"/>
  </item>
</layer-list>

@android:color/background_dark -> Splash 배경 색상 혹은 이미지
@mipmap/ic_launcher -> 서비스 로고*

  • Splash 배경으로 이미지를 넣게 될 경우 화면에 따라서 비율이 다르게 나타날 수 있으므로 색상을 넣는 것을 추천드립니다.

  • Splash Screen에 사용하는 로고는 .jpg/.png 같은 이미지 파일도 사용하셔야합니다.
    서비스 로고가 Vector 로 구성된 .xml 만 있을 경우 v23 미만에서는 Splash Screen 자체가 노출되지 않습니다. Theme 에서 <item name="android:windowDisablePreview">true</item> 적용한 것과 동일해집니다.

SplashTheme 추가

/values/styles.xml 에 SplashTheme를 추가합니다.

  <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="android:windowBackground">@drawable/splash</item>
  </style>

@drawable/splash -> 위에서 생성한 splash.xml

Activity Theme 설정

AndroidManifest.xml의 MainActivity에 SplashTheme를 적용합니다.

    <activity
      android:name=".MainActivity"
      android:theme="@style/SplashTheme">

@style/SplashTheme -> 위에서 생성한 SplashTheme

MainActivity Theme 복구

MainActivity의 Theme를 setTheme()를 이용하여 기존 테마로 되돌립니다.

  override fun onCreate(savedInstanceState: Bundle?) {
    setTheme(R.style.AppTheme)

super.onCreate(savedInstanceState) 이전에 setTheme를 하시는 것이 불필요한 라이프 사이클 회전을 방지합니다.

결과 화면

추가 팁

만약 onCreate에서 setTheme로 인한 예상하지 못한 오동작, 버그가 발견되거나 MainActivity의 Theme를 컨트롤하는게 부담스러우신 분들은 SplashActivity를 활용하는 방식으로 사용하시면 됩니다.

1) SplashActivity를 만들고 AndroidMainfest.xml에서 SplashActivity는 SplashTheme, MainActivity는 AppTheme를 적용합니다.
2) SplashActivity에서 onCreate되자마자 startActivity를 활용하여 MainActivity를 실행합니다.
SplashActivity에서 postdelayed를 활용할 경우 Splash 뜨는 시간을 강제로 고정할 수 있습니다. 다만, 1000ms 로 설정하면 실제로는 1000ms + a 의 시간동안 Splash Screen을 노출하게 됩니다. (디바이스 성능에 따라 a 의 시간이 달라짐)

Etc.

안드로이드에서 Splash Screen은 여러방법으로 구현 가능합니다.
이전에는 SplashActivity를 생성하고 postDelayed를 이용하여 500ms ~ 3000ms를 주고 startActivity로 MainActivity를 실행하는 방법을 주로 써왔습니다.

하지만 위의 방법은 유저들은 불필요하게 앱을 실행하면 흰화면 혹은 검은화면을 보고 개발자가 구현한 가짜 스플래시 화면을 보고 메인화면으로 진입하게 되는 비효율적인 동작을 하게됩니다.

위의 방법을 쓴 상태에서 앱을 시작하는데 처리하는 정보가 많아지게 된다면 유저는 흰화면을 보게되는 시간이 길어지게 됩니다.

이러한 앱 시작 시간 흰 화면이 뜨는 것과 관련해서 자세히 알아보고 싶으시다면 안드로이드 공식문서 앱 시작 시간(App startup time)를 확인하시면 더 자세한 정보를 확인하실 수 있습니다.

profile
Digital Nomad를 꿈꾸는 Android Engineer

1개의 댓글

comment-user-thumbnail
2022년 1월 25일

좋은글 감사합니다. 간혹 디바이스에 따라 스플래시 화면이 나오지 않는 경우가 있는데 그땐 splash.xml에서 bitmap을 제거하고 상위 item에 항목을 넣어주시면 작동됩니다.

답글 달기