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

Android 11 이하에서 맞춤 스플래시 화면을 구현하는 경우 앱을 SplashScreen API로 이전하여 Android 12 이상에서 제대로 표시되도록 합니다.

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 자리표시자 표시