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

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

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

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

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

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

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

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

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

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

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

Перенесите реализацию вашего экрана-заставки

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

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

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

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

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

    Ява

    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 , чтобы сохранить активность маршрутизации на месте, но остановить ее рендеринг. Это перенесет экран-заставку на следующую активность и обеспечит плавный переход.

Котлин

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

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

Удалить пользовательский экран-заставку Activity

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

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

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

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

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

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

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

Рисунок 1. Демонстрация заполнителей пользовательского интерфейса.