Как перенести заставку в 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 – графический объект или анимированный графический объект. Остальные атрибуты необязательны.

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

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

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

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

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

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

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

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