Как перенести заставку в Android 12 и более поздние версии

Если вы используете собственную заставку в Android 11 или более ранней версии, перенесите приложение на API SplashScreen, чтобы заставка правильно отображалась в Android 12 и более поздних версиях.

Начиная с Android 12 система применяет заставку по умолчанию при холодном и теплом запуске всех приложений. По умолчанию эта заставка создается с использованием значка приложения и атрибута windowBackground темы, если он одноцветный.

Если вы не перенесете приложение, его запуск на устройствах с Android 12 и более поздними версиями ОС может выполняться некорректно или приводить к непредвиденным результатам.

  • Если заставка реализована с помощью специальной темы, которая переопределяет android:windowBackground, то в Android 12 и более поздних версиях ОС она будет заменена на стандартную. Это может не соответствовать вашим ожиданиям.

  • Если заставка реализована с помощью специального элемента Activity, то при запуске приложения на устройствах с Android 12 или более поздней версии будут показываться две заставки: системная, а затем ваша.

Чтобы избежать этого, выполните перенос, как описано в этом документе. После перехода на API запуск приложения будет происходить быстрее и единообразнее с другими приложениями на платформе, а вы получите полный контроль над заставкой.

Библиотека совместимости SplashScreen

Вы можете использовать API SplashScreen напрямую, но мы настоятельно рекомендуем вместо этого использовать библиотеку совместимости Androidx SplashScreen. Библиотека совместимости использует API SplashScreen, обеспечивает обратную совместимость и создает единообразный внешний вид заставки во всех версиях Android. В этом документе используется библиотека совместимости.

Если вы перейдете на SplashScreen API напрямую, на устройствах с Android 11 и более ранними версиями заставка будет выглядеть так же, как и до перехода. Начиная с Android 12, заставка имеет внешний вид и интерфейс Android 12.

Если вы выполните перенос с помощью библиотеки совместимости SplashScreen, система будет показывать одну и ту же заставку во всех версиях Android.

Перенесите заставку

Чтобы перенести существующую реализацию заставки на Android 12 и более поздние версии, выполните следующие действия.

Эта процедура применяется независимо от того, какой тип реализации вы использовали ранее. Если вы переходите с выделенного Activity, следуйте рекомендациям, описанным в этом документе, чтобы адаптировать настроенную заставку Activity. Кроме того, API SplashScreen сокращает задержку при запуске, которая возникает из-за заставки.

Чтобы перенести заставку, выполните следующие действия:

  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. Вызовите installSplashScreen в начальном действии перед вызовом super.onCreate().

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

installSplashScreen возвращает объект заставки, который можно использовать для настройки анимации или увеличения времени показа заставки. Подробнее о настройке анимации рассказывается в разделах Как увеличить время показа заставки и Как настроить анимацию закрытия заставки.

Адаптируйте объект Activity для заставки.

После перехода на заставку для Android 12 и более поздних версий решите, что делать с предыдущей заставкой Activity. Вы можете:

  • Сохранить специальное действие, но не показывать его.
  • Оставить специальное действие для брендинга.
  • Удалите специальное действие и измените приложение.

Запретить показ пользовательского действия

Если предыдущая заставка Activity в основном использовалась для маршрутизации, подумайте, как ее удалить. Например, вы можете добавить прямую ссылку на действие или перейти к одному действию с подкомпонентами. Если это невозможно, используйте SplashScreen.setKeepOnScreenCondition, чтобы сохранить маршрутизацию, но остановить отрисовку. Это позволит перенести заставку в следующую активность и обеспечить плавный переход.

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

Оставьте специальное действие для брендинга

Если вы хотите использовать предыдущую заставку Activity в целях брендинга, вы можете перейти от системной заставки к собственной Activity, настроив анимацию для закрытия заставки. Однако по возможности лучше избегать этого сценария и использовать SplashScreen API для брендирования заставки.

Если вам нужно показать диалоговое окно, рекомендуем сделать это поверх последующей активности собственной заставки или поверх основной активности после системной заставки.

Удалите действие, связанное с заставкой

В целом мы рекомендуем Activityполностью удалить предыдущую заставку, чтобы избежать дублирования, повысить эффективность и сократить время загрузки. Есть разные способы избежать показа лишних заставок.

  • Используйте отложенную загрузку для компонентов, модулей и библиотек. Не загружайте и не инициализируйте компоненты или библиотеки, которые не требуются для работы приложения при запуске. Загружайте их позже, когда они понадобятся приложению.

    Если компонент действительно необходим для правильной работы приложения, загружайте его только тогда, когда он действительно нужен, а не во время запуска, или используйте фоновый поток для его загрузки после запуска приложения. Постарайтесь сделать так, чтобы Application.onCreate() был как можно легче.

    Вы также можете использовать библиотеку App Startup, чтобы инициализировать компоненты при запуске приложения. При этом убедитесь, что все необходимые модули для начального действия загружены и что при появлении модулей с отложенной загрузкой не возникает задержек.

  • Создать плейсхолдер, пока загружается небольшой объем данных. Используйте рекомендуемый подход к оформлению и отложите рендеринг до тех пор, пока приложение не будет готово. Чтобы реализовать заставку с обратной совместимостью, выполните действия, описанные в разделе Как увеличить время показа заставки.

  • Показать плейсхолдеры. Если загрузка выполняется по сети и ее продолжительность неизвестна, закройте заставку и покажите плейсхолдеры для асинхронной загрузки. Попробуйте добавить в область контента ненавязчивую анимацию, которая будет отражать состояние загрузки. Убедитесь, что структура загруженного контента максимально соответствует структуре скелета, чтобы обеспечить плавный переход при загрузке контента.

  • Используйте кеширование. Когда пользователь впервые открывает приложение, вы можете показывать индикаторы загрузки для некоторых элементов интерфейса, как показано на рисунке ниже. Когда пользователь в следующий раз откроет приложение, вы сможете показать ему этот кешированный контент, пока загружается более свежий.

Рисунок 1. Показ плейсхолдеров интерфейса.