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

Android 11 이하에서 맞춤 스플래시 화면을 구현하는 경우 Android 12 이상에서 올바르게 표시되도록 앱을 SplashScreen API로 이전하세요.

Android 12부터 시스템은 모든 앱의 콜드웜 스타트Android 시스템 기본 스플래시 화면을 적용합니다. 기본적으로 이 시스템 스플래시 화면은 앱의 런처 아이콘 요소와 테마의 windowBackground(단색인 경우)을 사용하여 구성됩니다.

앱을 이전하지 않으면 Android 12 이상에서 앱 실행 환경이 저하되거나 의도하지 않은 결과가 발생할 수 있습니다.

  • 기존 스플래시 화면이 android:windowBackground를 재정의하는 맞춤 테마를 사용하여 구현된 경우 Android 12 이상에서 시스템은 맞춤 스플래시 화면을 기본 Android 시스템 스플래시 화면으로 바꿉니다. 이는 앱의 의도된 환경이 아닐 수도 있습니다.

  • 기존 스플래시 화면이 전용 Activity를 사용하여 구현된 경우 Android 12 이상을 실행하는 기기에서 앱을 실행하면 중복 스플래시 화면이 생성됩니다. 즉, 시스템 스플래시 화면이 표시된 다음 기존 스플래시 화면 활동이 표시됩니다.

이 문서에 설명된 이전 프로세스를 완료하여 이러한 성능 저하 또는 의도하지 않은 환경을 방지할 수 있습니다. 이전 후 API는 시작 시간을 개선하고, 스플래시 화면 환경을 완전히 제어할 수 있으며, 플랫폼의 다른 앱과 더 일관된 실행 환경을 만듭니다.

SplashScreen compat 라이브러리

SplashScreen API를 직접 사용할 수도 있지만 대신 Androidx SplashScreen compat 라이브러리를 사용하는 것이 좋습니다. compat 라이브러리는 SplashScreen API를 사용하고 이전 버전과의 호환성을 사용 설정하고 모든 Android 버전에서 스플래시 화면 표시를 위한 일관된 디자인을 제공합니다. 이 문서는 compat 라이브러리를 사용하여 작성됩니다.

SplashScreen API를 사용하여 직접 이전하는 경우 Android 11 이하에서는 스플래시 화면이 이전 전과 동일하게 표시됩니다. Android 12부터 스플래시 화면에는 Android 12의 디자인이 적용됩니다.

SplashScreen compat 라이브러리를 사용하여 이전하면 시스템은 모든 Android 버전에서 동일한 스플래시 화면을 표시합니다.

스플래시 화면 구현 이전

기존 스플래시 화면 구현을 Android 12 이상으로 이전하려면 다음 단계를 완료하세요.

이 절차는 이전하려는 모든 구현 유형에 적용됩니다. 전용 Activity에서 이전하는 경우 이 문서에 설명된 권장사항에 따라 맞춤설정된 스플래시 화면 Activity를 조정하세요. 또한 SplashScreen API는 전용 스플래시 화면 활동으로 인해 발생하는 시작 지연 시간을 줄여줍니다.

스플래시 화면을 이전하려면 다음 단계를 따르세요.

  1. build.gradle 파일에서 compileSdkVersion를 변경하고 종속 항목에 SplashScreen compat 라이브러리를 포함합니다.

    build.gradle
    
    android {
       compileSdkVersion 31
       ...
    }
    dependencies {
       ...
       implementation 'androidx.core:core-splashscreen:1.0.0-beta02'
    }
    
  2. 상위 요소가 Theme.SplashScreen인 테마를 만듭니다. postSplashScreenTheme 값을 Activity에서 사용해야 하는 테마로 설정하고 windowSplashScreenAnimatedIcon 값을 드로어블 또는 애니메이션된 드로어블로 설정합니다. 다른 속성은 선택사항입니다.

    <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 a drawable or an animated
            drawable. One of these is required. -->
       <item name="windowSplashScreenAnimatedIcon">@drawable/...</item>
       <!-- Required for animated icons. -->
       <item name="windowSplashScreenAnimationDuration">200</item>
    
       <!-- Set the theme of the Activity that directly follows your splash
       screen. This is required. -->
       <item name="postSplashScreenTheme">@style/Theme.App</item>
    </style>
    

    아이콘 아래에 배경색을 추가하려면 Theme.SplashScreen.IconBackground 테마를 사용하고 windowSplashScreenIconBackground 속성을 설정하면 됩니다.

  3. 매니페스트에서 시작 활동의 테마를 이전 단계에서 만든 테마로 바꿉니다.

    <manifest>
       <application android:theme="@style/Theme.App.Starting">
        <!-- or -->
            <activity android:theme="@style/Theme.App.Starting">
    ...
    
  4. super.onCreate()를 호출하기 전에 시작 활동에서 installSplashScreen을 호출합니다.

    Kotlin

    class MainActivity : Activity() {
    
       override fun onCreate(savedInstanceState: Bundle?) {
           // Handle the splash screen transition.
           val splashScreen = installSplashScreen()
    
           super.onCreate(savedInstanceState)
           setContentView(R.layout.main_activity)
    ...
    

    Java

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
             // Handle the splash screen transition.
             SplashScreen splashScreen = SplashScreen.installSplashScreen(this);
    
             super.onCreate(savedInstanceState);
             setContentView(R.layout.main_activity);
        }
    }
    

installSplashScreen는 스플래시 화면 객체를 반환하며, 이 객체를 사용하여 애니메이션을 맞춤설정하거나 화면에 스플래시 화면을 더 오래 표시할 수 있습니다. 애니메이션 맞춤설정에 관한 자세한 내용은 스플래시 화면을 화면에 더 오래 표시스플래시 화면 닫기 애니메이션 맞춤설정을 참고하세요.

맞춤 스플래시 화면 활동을 스플래시 화면에 맞게 조정

Android 12 이상의 스플래시 화면으로 이전한 후 이전의 맞춤 스플래시 화면 Activity를 어떻게 처리할지 결정합니다. 다음과 같은 옵션이 있습니다.

  • 맞춤 활동은 유지하지만 표시되지 않도록 합니다.
  • 브랜딩을 위해 맞춤 활동을 유지합니다.
  • 맞춤 활동을 삭제하고 필요에 따라 앱을 조정합니다.

맞춤 활동이 표시되지 않도록 방지

이전의 스플래시 화면 Activity가 주로 라우팅에 사용된다면 삭제하는 방법을 고려해 보세요. 예를 들어 실제 활동에 직접 연결하거나 부분 구성요소가 있는 단일 활동으로 이동할 수 있습니다. 이 작업이 가능하지 않으면 SplashScreen.setKeepOnScreenCondition를 사용하여 라우팅 활동을 그대로 유지하되 렌더링을 중지할 수 있습니다. 이렇게 하면 스플래시 화면이 다음 활동으로 전환되고 원활한 전환이 지원됩니다.

Kotlin

  class RoutingActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        val splashScreen = installSplashScreen()
        super.onCreate(savedInstanceState)

        // Keep the splash screen visible for this Activity.
        splashScreen.setKeepOnScreenCondition { true }
        startSomeNextActivity()
        finish()
     }
   ...
  

Java

  public class RoutingActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      SplashScreen splashScreen = SplashScreen.installSplashScreen(this);

       super.onCreate(savedInstanceState);

       // Keep the splash screen visible for this Activity.
       splashScreen.setKeepOnScreenCondition(() -> true );
       startSomeNextActivity();
       finish();
    }
  ...
  

브랜딩에 맞춤 활동 유지

브랜딩을 위해 이전 스플래시 화면 Activity를 사용하려는 경우 스플래시 화면을 닫는 애니메이션을 맞춤설정하여 시스템 스플래시 화면에서 맞춤 스플래시 화면 Activity으로 전환할 수 있습니다. 하지만 가능하면 이 시나리오를 피하고 SplashScreen API를 사용하여 스플래시 화면을 브랜딩하는 것이 가장 좋습니다.

대화상자를 표시해야 한다면 후속 맞춤 스플래시 화면 활동 위에 표시하거나 시스템 스플래시 화면 후 기본 활동 위에 표시하는 것이 좋습니다.

맞춤 스플래시 화면 활동 삭제

일반적으로 스플래시 화면이 중복되지 않도록 하고 효율성을 높이며 스플래시 화면 로드 시간을 줄이려면 이전 맞춤 스플래시 화면 Activity을 완전히 삭제하는 것이 좋습니다. 중복된 스플래시 화면 활동이 표시되지 않도록 하는 데 사용할 수 있는 다양한 기법이 있습니다.

  • 구성요소, 모듈 또는 라이브러리에 지연 로드를 사용합니다. 실행 시 앱이 작동하는 데 필요하지 않은 구성요소 또는 라이브러리를 로드하거나 초기화하지 마세요. 나중에 앱에서 필요할 때 로드합니다.

    앱이 제대로 작동하기 위해 정말로 구성요소가 필요한 경우 시작 시간이 아닌 실제로 필요할 때만 로드하거나 앱이 시작된 후 백그라운드 스레드를 사용하여 로드합니다. Application.onCreate()를 가능한 한 가볍게 유지해 보세요.

    앱 시작 라이브러리를 사용하여 애플리케이션 시작 시 구성요소를 초기화할 수도 있습니다. 그렇게 할 때 시작 활동에 필요한 모든 모듈을 계속 로드하고 지연 로드된 모듈을 사용할 수 있게 되는 버벅거림이 발생하지 않도록 해야 합니다.

  • 소량의 데이터를 로컬에 로드하는 동안 자리표시자를 만듭니다. 권장되는 테마 설정 방식을 사용하고 앱이 준비될 때까지 렌더링을 보류하세요. 이전 버전과 호환되는 스플래시 화면을 구현하려면 스플래시 화면을 화면에 더 오래 표시에 설명된 단계를 따르세요.

  • 자리표시자를 표시합니다. 기간이 확실하지 않은 네트워크 기반 로드의 경우 스플래시 화면을 닫고 비동기 로드를 위한 자리표시자를 표시합니다. 로드 상태를 반영하는 콘텐츠 영역에는 섬세한 애니메이션을 적용하는 것이 좋습니다. 콘텐츠가 로드될 때 원활한 전환을 지원하기 위해 로드된 콘텐츠 구조가 스켈레톤 구조와 일치하는지 확인합니다.

  • 캐싱 사용 사용자가 앱을 처음 열 때 다음 그림과 같이 일부 UI 요소의 로드 표시기를 표시할 수 있습니다. 다음에 사용자가 앱으로 돌아올 때 최신 콘텐츠를 로드하는 동안 캐시된 콘텐츠를 표시할 수 있습니다.

그림 1. UI 자리표시자 표시