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

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

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

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

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

  • Если ваша заставка реализована с помощью специального элемента 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 – объект Drawable или AnimatedDrawable. Остальные атрибуты необязательны.

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

    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 возвращает объект заставки, который можно использовать для настройки анимации или увеличения времени показа заставки. Подробнее о настройке анимации рассказывается в разделах Как увеличить время показа заставки и Как настроить анимацию закрытия заставки.

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

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

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

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

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

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.

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

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

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

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

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

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

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

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