English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Метод решения проблемы белого и черного экрана на Splash-интерфейсе Android

Введение

Я уверен, что многие разработчики Android встречали такую потребность:

 1. Реализовать экран Splash, на котором естьrelated background image и кнопка запуска.
 2. После нажатия кнопки перейти на домашнюю страницу, после этого пользователи больше не будут видеть этот экран Splash. 

Мы также уверены, что многие студенты встречали такую проблему:

•При втором входе в приложение, несмотря на то, что вы уже напрямую перешли на домашнюю страницу из экрана Splash, все равно中出现了一下 белый экран, черный экран или экран с ActionBar.

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

Решение

Сначала мы предложим решение, а затем конкретно проанализируем причины возникновения проблемы. Чтобы избежать того, чтобы большой текст阻碍л的热情 студентов.

Решение очень простое, кратко概括: настройте тему для Splash Activity, содержимое темы: полный экран + прозрачность.

Добавление темы SplashTheme в style.xml:

<style name="SplashTheme" parent="AppTheme">
 <item name="android:windowFullscreen">true</item>
 <item name="android:windowIsTranslucent">true</item>
</style>

В AndroidManifest.xml настроен тема SplashActivity:

<activity android:name=".activity.SplashActivity"
 android:theme="@style/SplashTheme">
 <intent-filter>
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>
</activity>

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

Процесс запуска окна компонента Activity

Прежде всего, хочу отметить, что данная часть содержимого основана на блоге учителя Ло Шэньヤна. Для удобства понимания контент был сжат. Если есть нарушение авторских прав, я немедленно удалю этот анализ.

Чтобы понять根源, из-за которой появляется белый экран, необходимо отслеживать процесс запуска окна компонента Activity. Во время запуска компонент Activity вызывает метод startActivityLocked класса ActivityStack. Замечание: когда вызывается метод startActivityLocked класса ActivityStack, компонент Activity все еще находится в процессе запуска, то есть его окно еще не отображается, но в этот момент сервис ActivityManagerService проверяет, нужно ли отображать окно запуска для инициирующегося компонента Activity. Если нужно, то сервис ActivityManagerService запрашивает у сервиса WindowManagerService установку окна запуска для инициирующегося компонента Activity (примечание: это окно запуска и является причиной появления белого экрана).

1. ActivityStack.startActivityLocked

public class ActivityStack {
 // установите значение false для отключения предпросмотра, который отображается во время запуска новой активности
 // инициируется.
 static final boolean SHOW_APP_STARTING_PREVIEW = true;
 private final void startActivityLocked(ActivityRecord r, boolean newTask, boolean doResume) {
 final int NH = mHistory.size();
 int addPos = -1;
 // Поместите новую активность в顶端 стек, чтобы она была рядом для взаимодействия
 // с пользователем.
 if (addPos < 0) {
  addPos = NH;
 {}
 // Вставьте активность в стек истории и продолжайте
 mHistory.add(addPos, r);
 if (NH > 0) {
  // Мы хотим показать предварительный экран запуска, если мы
  // переключение на новую задачу или процесс следующей активности
  // не работает в настоящее время.
  boolean showStartingIcon = newTasks;
  ProcessRecord proc = r.app;
  if (proc == null) {
  proc = mService.mProcessNames.get(r.processName, r.info.applicationInfo.uid);
  {}
  if (proc == null || proc.thread == null) {
  showStartingIcon = true;
  {}
 {}
 {}
{}

Продолжение следует…希望大家继续关注。

Это все содержимое статьи, надеюсь, это поможет вам в изучении, также希望大家多多支持 tuition.

Декларация: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему автору. Контент предоставлен пользователями Интернета, самостоятельно загружен, сайт не обладает правами собственности, не прошел редактирование, также не несет ответственности за соответствующие юридические вопросы. Если вы обнаружите спорное содержимое, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки почты, пожалуйста, замените # на @) для сообщения о нарушении и предоставьте соответствующие доказательства. Если после проверки будет установлено, что это спорное содержимое, сайт немедленно удалил спорное содержимое.

Основной учебник
Вам может понравиться