스플래시 화면 구현을 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 호환성 라이브러리를 포함합니다.

    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)
    ...

    자바

    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()
     }
   ...
  

자바

  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 자리표시자를 표시합니다.