Если вы реализуете пользовательский экран-заставку в 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
. Библиотека совместимости использует API SplashScreen
, обеспечивает обратную совместимость и обеспечивает единообразный внешний вид и функциональность заставки во всех версиях Android. Этот документ написан с использованием библиотеки совместимости.
При миграции напрямую через API SplashScreen
на Android 11 и более ранних версиях экран-заставка будет выглядеть точно так же, как и до миграции. Начиная с Android 12, экран-заставка будет иметь внешний вид и функции Android 12.
Если вы выполняете миграцию с использованием совместимой библиотеки SplashScreen
, система отображает один и тот же экран-заставку на всех версиях Android.
Перенесите реализацию вашего экрана-заставки
Выполните следующие шаги, чтобы перенести существующую реализацию заставки на Android 12 и более поздние версии.
Эта процедура применима к любому типу реализации, с которого вы переходите. Если вы переходите с выделенного Activity
, следуйте рекомендациям, описанным в этом документе, по адаптации вашего настроенного экрана-заставки Activity
. API SplashScreen
также уменьшает задержку запуска, возникающую при использовании выделенного экрана-заставки Activity.
Чтобы перенести заставку, выполните следующие действия:
В файле
build.gradle
изменитеcompileSdkVersion
и включите библиотеку совместимостиSplashScreen
в зависимости.build.gradle android { compileSdkVersion 31 ... } dependencies { ... implementation 'androidx.core:core-splashscreen:1.0.0-beta02' }
Создайте тему с родительским элементом
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
.В манифесте замените тему начального действия на тему, созданную на предыдущем шаге.
<manifest> <application android:theme="@style/Theme.App.Starting"> <!-- or --> <activity android:theme="@style/Theme.App.Starting"> ...
Вызовите
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
возвращает объект экрана-заставки, который можно использовать для настройки анимации или для более длительного отображения экрана-заставки. Подробнее о настройке анимации см. в разделах Длительное отображение экрана-заставки и Настройка анимации закрытия экрана-заставки .
Адаптируйте свою пользовательскую активность к экрану-заставке
После перехода на экран-заставку для Android 12 и более поздних версий решите, что делать с вашим предыдущим пользовательским экраном-заставкой Activity
. Доступны следующие варианты:
- Сохраните пользовательское действие, но запретите его отображение.
- Сохраните пользовательское действие в целях брендинга.
- Удалите пользовательскую активность и адаптируйте свое приложение по мере необходимости.
Запретить отображение пользовательской активности
Если предыдущая Activity
заставка используется преимущественно для маршрутизации, рассмотрите возможность её удаления. Например, можно напрямую ссылаться на саму Activity или перейти к отдельной Activity с подкомпонентами. Если это невозможно, можно использовать SplashScreen.setKeepOnScreenCondition
, чтобы сохранить активность маршрутизации, но остановить её рендеринг. Это перенесёт заставку на следующую Activity и обеспечит плавный переход.
Котлин
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
SplashScreen
для брендинга вашей заставки.
Если вам необходимо отобразить диалоговое окно , мы рекомендуем отображать его поверх последующей пользовательской активности заставки или поверх основной активности после системной заставки.
Удалить пользовательскую заставку Activity
Как правило, мы рекомендуем полностью удалить предыдущую пользовательскую Activity
на заставке, чтобы избежать дублирования заставок, повысить эффективность и сократить время их загрузки. Существуют различные методы, позволяющие избежать отображения лишних активностей на заставке.
Используйте ленивую загрузку для компонентов, модулей и библиотек. Избегайте загрузки и инициализации компонентов и библиотек, которые не требуются для работы приложения при запуске. Загрузите их позже, когда они понадобятся приложению.
Если вашему приложению действительно необходим компонент для корректной работы, загружайте его только тогда, когда он действительно нужен, а не при запуске, или используйте фоновый поток для его загрузки после запуска приложения. Постарайтесь сделать
Application.onCreate()
как можно более лёгким.Вы также можете использовать библиотеку App Startup для инициализации компонентов при запуске приложения. При этом убедитесь, что все необходимые модули для стартовой активности загружены, и не допускайте сбоев при доступе к лениво загруженным модулям.
Создайте заглушку, загружая небольшой объём данных локально. Используйте рекомендуемый подход к тематизации и приостановите рендеринг до полной готовности приложения. Чтобы реализовать обратно совместимую заставку, следуйте инструкциям в разделе «Удержание заставки на экране в течение более длительного времени» .
Отображайте плейсхолдеры. Для сетевых загрузок с неопределённой продолжительностью уберите заставку и отобразите плейсхолдеры для асинхронной загрузки. Рассмотрите возможность применения лёгкой анимации к области контента, отражающей состояние загрузки. Убедитесь, что структура загруженного контента максимально соответствует структуре скелета , чтобы обеспечить плавный переход при загрузке контента.
Используйте кэширование . Когда пользователь открывает ваше приложение впервые, вы можете отображать индикаторы загрузки для некоторых элементов пользовательского интерфейса, как показано на рисунке ниже. При следующем возвращении пользователя в приложение вы можете отображать этот кэшированный контент, одновременно загружая более новый контент.