Если вы реализуете собственный экран-заставку в 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. Этот документ написан с использованием библиотеки совместимости.
Если вы выполняете миграцию напрямую с помощью SplashScreen
API, на Android 11 и более ранних версиях ваш экран-заставка будет выглядеть точно так же, как и до миграции. Начиная с Android 12, заставка имеет внешний вид, как в Android 12.
Если вы выполняете миграцию с помощью библиотеки совместимости SplashScreen
, система отображает один и тот же экран-заставку на всех версиях Android.
Перенесите реализацию экрана-заставки
Выполните следующие шаги, чтобы перенести существующую реализацию экрана-заставки на Android 12 и более поздние версии.
Эта процедура применима к любому типу реализации, с которого вы переходите. Если вы переходите с выделенного Activity
, следуйте рекомендациям, описанным в этом документе, для адаптации настроенного Activity
заставки. API SplashScreen
также снижает задержку при запуске, возникающую при использовании специального действия на экране-заставке.
Чтобы перенести заставку, выполните следующие действия:
В файле
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
экрана-заставки в основном используется для маршрутизации, рассмотрите способы ее удаления. Например, вы можете напрямую связать его с реальным действием или перейти к отдельному действию с подкомпонентами. Если это невозможно, вы можете использовать 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
заставки, чтобы избежать дублирования заставок, повысить эффективность и сократить время загрузки заставки. Существуют различные методы, которые можно использовать, чтобы избежать отображения избыточных действий на экране-заставке.
Используйте отложенную загрузку для своих компонентов, модулей или библиотек. Избегайте загрузки или инициализации компонентов или библиотек, которые не необходимы для работы приложения при запуске. Загрузите их позже, когда они понадобятся приложению.
Если вашему приложению действительно нужен компонент для правильной работы, загружайте его только тогда, когда он действительно необходим, а не во время запуска, или используйте фоновый поток для его загрузки после запуска приложения. Постарайтесь сделать свой
Application.onCreate()
как можно более легким.Вы также можете воспользоваться библиотекой запуска приложений для инициализации компонентов при запуске приложения. При этом обязательно загружайте все необходимые модули для запуска активности и не вводите джанки, когда лениво загруженные модули становятся доступными.
Создайте заполнитель при локальной загрузке небольшого объема данных. Используйте рекомендуемый подход к созданию тем и отложите рендеринг до тех пор, пока приложение не будет готово. Чтобы реализовать обратную совместимость заставки, выполните действия, описанные в разделе Сохранение заставки на экране в течение длительного времени .
Показать заполнители. Для сетевых загрузок с неопределенной продолжительностью закройте заставку и покажите заполнители для асинхронной загрузки. Рассмотрите возможность применения тонкой анимации к области содержимого, отражающей состояние загрузки. Убедитесь, что структура загруженного контента соответствует структуре скелета , а также обеспечивает плавный переход при загрузке контента.
Используйте кэширование . Когда пользователь впервые открывает ваше приложение, вы можете отображать индикаторы загрузки для некоторых элементов пользовательского интерфейса, как показано на следующем рисунке. В следующий раз, когда пользователь вернется в ваше приложение, вы сможете показать этот кэшированный контент при загрузке более нового контента.