Перенесите реализацию заставки на Android 12 и более поздние версии.

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

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

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

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

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

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

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

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

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

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

Перенесите реализацию заставки.

Выполните следующие шаги, чтобы перенести существующую заставку на Android 12 и более поздние версии.

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

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

  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 или animated drawable. Остальные атрибуты необязательны.

    <style name="Theme.App.Starting" parent="Them>e.Sp<lashScreen"
       !-- Set the splash screen background, animated icon, and anima>tion<
       duration. --
       item name="wind>owSplashSc<reenB>ackgr<ound"@color/.../item
    
       !-- Use windowSplashScreenAnimatedIcon to add a drawable or an animated
            drawable>. On<e of these is required. --
       item name=&q>uot;windowSpl<ashSc>reen<AnimatedIcon"@drawable/.../ite>m
      < !-- Required for animated icons. --
       item na>me=<">;wind<owSplashScreenAnimationDuration"200/item
    
       !-- Set the theme of the Activity that directly f>ollo<ws your splash
       screen. This is> required. --
      < item <name=&>quot;postSplashScreenTheme"@style/Theme.App/item
    /style
    

    Если вы хотите добавить фоновый цвет под иконкой, вы можете использовать тему Theme.SplashScreen.IconBackground и установить атрибут windowSplashScreenIconBackground .

  3. В манифесте замените тему начальной активности на тему, созданную на предыдущем шаге.

    <manifest>
       <application android:theme="@style/Theme.App.Star>ting&<quot;
       > !-- or -<-
            activity android:theme="@style/Them>e.App.Starting"
    ...
    
  4. Перед вызовом super.onCreate() вызовите installSplashScreen в начальной активности.

    Котлин

    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.

Если предыдущая 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()
     }
   ...
  

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 закрытия заставки . Однако, по возможности, лучше избегать этого сценария и использовать API SplashScreen для брендирования вашей заставки.

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

Удалить пользовательскую заставку Activity

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

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

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

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

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

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

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

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