Skip to main content

Command Palette

Search for a command to run...

[Android] Spalsh Screen

Updated
3 min read
[Android] Spalsh Screen

더 잘하고 싶은 안드로이드 개발자.

https://github.com/jinukeu

Android 12 이상에서 Cold, Warm Start시 새로운 Android의 기본 스플래시 화면이 강제로 적용된다. Android 11 이하 버전일 때 별도의 스플래시 화면을 만들어놨다면 Android 12 부터는 2개의 스플래시 화면이 보여진다.(Android 12 부터 적용되는 기본 스플래시 화면 + 따로 만든 Splash 화면)

Cold, Warm Start(+ Hot)과 새로운 Splash Screen 대응 방안에 대해 소개하겠다.

Cold, Warm, Hot Start

앱은 Cold Start, Warm Start, Hot Start 세 가지 상태 중 하나에서 시작한다.

Cold Start

앱이 처음부터 시작할 때 Cold Start라 한다. 기기가 부팅된 후 또는 앱이 종료된 이후, 앱을 처음 실행할 때 발생한다.

Warm Start

프로세스가 메모리 상에 아직 남아있는지가 cold start와의 중요한 차이점이다. 장시간 사용하지 않거나 메모리 부족으로 인해 프로세스를 안드로이드가 후 순위로 밀어낸 후에(그러나 아직 프로세스가 kill 되지 않은 순간) 다시 애플리케이션을 실행할 때 warm start로 인식된다.

Hot Start

안드로이드 시스템이 Activity를 포그라운드로 가져오기만 하면 된다. 앱의 모든 activity가 메모리에 살아있다면 객체 초기화, 레이아웃 확장, 렌더링을 반복하지 않아도 된다.

만약 Hot Start일때도 스플래시 화면을 보이게 만들었다면, 이는 불필요한 작업이다. 따라서 개발자가 Cold, Warm Start에만 스플래시 화면을 보이게 하도록 만들기 위해 안드로이드 12 이상에서 Splash Screen을 강제한 것으로 추측된다.

Migration Splash Screen

그러면 Android 11 이하에서 만들어놓은 스플래시 화면을 새로운 SplashScreen으로 어떻게 이전할까? -> SplashScreen Compat(중요) 라이브러리를 사용하면 된다. (Compat이 없는 SplashScreen Api는 Android 12이상에서만 동작한다.)

적용 방법

1.build.gradle 디펜던시 추가

dependencies {
   ...
   implementation 'androidx.core:core-splashscreen:1.0.1'
}

2.SplashScreen에 적용할 theme 추가

parent가 Theme.SplashScreen 인 theme를 추가한다. postSplashScreenTheme 에는 SplashScreen이 보여진 이후에 적용할 theme를 적는다.

<style name="Theme.App.Starting" parent="Theme.SplashScreen">
   // Set the splash screen background, animated icon, and animation duration.
   <item name="windowSplashScreenBackground">@color/...</item>

   // Use windowSplashScreenAnimatedIcon to add either a drawable or an
   // animated drawable. One of these is required.
   <item name="windowSplashScreenAnimatedIcon">@drawable/...</item>
   <item name="windowSplashScreenAnimationDuration">200</item>  # Required for
                                                                # animated icons

   // Set the theme of the Activity that directly follows your splash screen.
   <item name="postSplashScreenTheme">@style/Theme.App</item>  # Required.
</style>

3.매니페스트에서 activity또는 application의 theme를 이전 단계에서 만든 테마로 바꾼다.

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

4.Activity에서 setContentView 이전에 installSplashScreen 을 호출한다.

class SplashScreenSampleActivity : Activity() {

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

       // Handle the splash screen transition.
       val splashScreen = installSplashScreen()

       setContentView(R.layout.main_activity)
...

5.특정 작업이 끝난 이후까지 스플래시 스크린을 보여주게 하고 싶다면 다음과 같이 설정한다.

// Create a new event for the activity.
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // Set the layout for the content view.
    setContentView(R.layout.main_activity)

    // Set up an OnPreDrawListener to the root view.
    val content: View = findViewById(android.R.id.content)
    content.viewTreeObserver.addOnPreDrawListener(
        object : ViewTreeObserver.OnPreDrawListener {
            override fun onPreDraw(): Boolean {
                // Check if the initial data is ready.
                return if (viewModel.isReady) {
                    // The content is ready; start drawing.
                    content.viewTreeObserver.removeOnPreDrawListener(this)
                    true
                } else {
                    // The content is not ready; suspend.
                    false
                }
            }
        }
    )
}

이제 안드로이드 12 이하에서도 새로운 스플래시 화면이 일관된 디자인으로 적용된다.

참고

https://sungbin.land/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C12-%EC%8A%A4%ED%94%8C%EB%9E%98%EC%8B%9C-%EB%8C%80%EC%9D%91%ED%95%98%EA%B8%B0-1729f69dc33f

https://no-dev-nk.tistory.com/54

https://developer.android.com/guide/topics/ui/splash-screen/migrate?hl=ko

More from this blog

단위테스트 2장 정리

단위 테스트의 정의에는 많은 늬앙스가 있다. 크게 고전파, 런던파로 나뉜다. 고전파: 모든 사람이 단위 테스트와 테스트 주도 개발에 원론적으로 접근하는 방식 런던파: 런던의 프로그래밍 커뮤니티에서 시작 단위 테스트의 정의 단위 테스트는 작은 코드 조각을 검증하고 빠르게 수행하고 격리된 방식으로 처리하는 자동화된 테스트다. 격리 문제에 대한 런던파의 접근 코드 조각을 격리된 방식으로 검증한다는 것은 무엇을 의미할까? 런던파에서는 테스트 ...

Sep 3, 20243 min read

단위 테스트 1장 정리

단위 테스트 1장 정리 내용입니다. 단위 테스트에 시간을 투자할 때는 항상 최대한 이득을 얻도록 노력해야하며, 테스트에 드는 노력을 가능한 줄이고 그에 따르는 이득을 최대화해야 한다. 이 책에서 다루는 내용은 비용 편익 분석 방법을 배우고 특정 상황에서 적절한 테스트 기술을 적용할 수 있다. 또한 공통적인 안티 패턴을 피하는 방법도 배운다. 단위 테스트의 목표 단위 테스트의 목표는 무엇인가? 프로젝트의 지속 가능한 성장을 가능하게 하는 것이다...

Aug 27, 20242 min read

23년 하반기 회고

23년 상반기 회고에서 이어지는 글이다. 8 - 9월 이력서 제출 그리고 ... 이력서와 포트폴리오를 만들었다. 꽤나 잘 만들었다고 생각했다. 개발자 지인들의 첨삭, 인프런 멘토링, 유료 이력서 첨삭 서비스를 받으며 칭찬을 꽤 받았기 때문이다. 내가 보기에도 괜찮은 것 같고 ... 다른 사람들이 보기에도 괜찮다고 했으니 서류 합격률은 꽤 높을거라 생각했다. 50개의 서류를 넣은 결과, 3번의 서류 합격 그리고 단 한 곳에서만 최종합격했다. (최...

Jan 1, 20243 min read
23년 하반기 회고

[Android] Compose 수명 주기, 부수효과

수명 주기 개요 컴포지션은 UI를 기술하는 컴포저블의 트리 구조이다.컴포지션은 초기 컴포지션을 통해서만 생성되고 리컴포지션을 통해서만 업데이트 된다. 컴포저블의 수명 주기 컴포지션 시작 리컴포지션 컴포지션 종료 리컴포지션은 일반적으로 State<T> 객체가 변경되면 트리거됩니다. 컴포지션 내 컴포저블의 분석 컴포지션 내 컴포저블의 인스턴스는 호출 사이트(call site)로 식별된다. (호출 사이트는 컴포저블이 호출되는 소스코드 위치...

Dec 22, 20236 min read
[Android] Compose 수명 주기, 부수효과

[Android] rememberUpdatedState 완벽 이해

rememberUpdatedState 정의 공식 문서에는 다음과 같이 적혀있다. 값이 변경되는 경우 다시 시작되지 않아야 하는 효과(Effect)에서 값 참조 포스팅을 정리하면서 정의한 rememberUpdateState는 아래와 같다. remember는 초기 컴포지션에서만 값을 저장하고 리컴포지션 때 들어온 값은 저장하지 않는다. 리컴포지션 때 들어온 값도 저장하고 싶을 때 rememberUpdateState를 사용한다. 이게 도대체 ...

Dec 14, 20234 min read
[Android] rememberUpdatedState 완벽 이해

Jinukeu

33 posts