Android – предотrotation белого экрана при запуске

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

Настройка android:windowDisablePreview = "true" очевидно, не работает здесь. Я также не могу установить родительскую тему заставки на Theme.Holo.NoActionBar как описано здесь , потому что [к сожалению] мой экран заставки использует ActionBar .

Между тем приложения, которые не расширяют class Application , не отображают белый экран при запуске.

Дело в том, что в идеале инициализации, выполняемые в объекте Application должны происходить до отображения первой Activity . Поэтому мой вопрос: как я могу выполнить эти инициализации при запуске приложения без использования объекта Application ? Возможно, я использую Thread или Service ?

Это интересная проблема, о которой стоит подумать. Я не могу обойти его обычным способом (установив тему NoActionBar ), так как трагически мой экран Splash фактически имеет ActionBar из-за некоторых несвязанных причин.

Заметка:

Я уже говорил о следующих вопросах:

  • Как исправить белый экран в приложении Запуск?

  • Экран заставки Android белый в начале?

  • Белый экран перед брызговым экраном

  • Белый фон, когда приложение Android запускается

  • Почему появляется белый экран на 1сек при запуске приложений на Android?

Рекомендации:

  • Шаблоны – запуск экранов .

  • Фирменный экран запуска: новый всплеск для Android .

  • Заставки экранов правильно .

Проблема с белым фоном вызвана из-за холодного запуска Android в то время, когда приложение загружается в память, и этого можно избежать:

 public class OnboardingWithCenterAnimationActivity extends AppCompatActivity { public static final int STARTUP_DELAY = 300; public static final int ANIM_ITEM_DURATION = 1000; public static final int ITEM_DELAY = 300; private boolean animationStarted = false; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { setTheme(R.style.AppTheme); getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); super.onCreate(savedInstanceState); setContentView(R.layout.activity_onboarding_center); } @Override public void onWindowFocusChanged(boolean hasFocus) { if (!hasFocus || animationStarted) { return; } animate(); super.onWindowFocusChanged(hasFocus); } private void animate() { ImageView logoImageView = (ImageView) findViewById(R.id.img_logo); ViewGroup container = (ViewGroup) findViewById(R.id.container); ViewCompat.animate(logoImageView) .translationY(-250) .setStartDelay(STARTUP_DELAY) .setDuration(ANIM_ITEM_DURATION).setInterpolator( new DecelerateInterpolator(1.2f)).start(); for (int i = 0; i < container.getChildCount(); i++) { View v = container.getChildAt(i); ViewPropertyAnimatorCompat viewAnimator; if (!(v instanceof Button)) { viewAnimator = ViewCompat.animate(v) .translationY(50).alpha(1) .setStartDelay((ITEM_DELAY * i) + 500) .setDuration(1000); } else { viewAnimator = ViewCompat.animate(v) .scaleY(1).scaleX(1) .setStartDelay((ITEM_DELAY * i) + 500) .setDuration(500); } viewAnimator.setInterpolator(new DecelerateInterpolator()).start(); } } } 

расположение

           

img лицо

       

Добавьте эту тему в свой всплывающий экран в манифесте

     

который будет производить такой эффект

занятая кошка

для получения более подробной информации и других решений вы можете проверить этот BlogPost

добавьте эту строку в тему приложения

 true 

Прежде всего, чтобы удалить белый экран, прочтите это: https://www.bignerdranch.com/blog/splash-screens-the-right-way/

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

Вы пытались установить атрибут android:windowBackground в теме своей активности запуска, либо в цвет, либо в виде рисунка?

Например, это:

 @android:color/black 

при добавлении в тему активности Launcher при запуске будет отображаться черный цвет (а не белый цвет). Это простой трюк, чтобы скрыть длительную инициализацию, показывая вашим пользователям что-то, и он отлично работает, даже если вы подclassифицируете объект Application.

Избегайте использования других конструкций (даже streamов) для выполнения длинных задач инициализации, потому что вы не сможете контролировать жизненный цикл таких конструкций. Объект Application – это правильное место для выполнения такого рода действий.

Скопируйте и вставьте эти две строки в свою манифестную тему приложения, т.е. res / styles / AppTheme. то он будет работать как шарм ..

 true true 

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

Я предлагаю использовать несколько разных методов при запуске операции. Такими являются onStart() (которые называются первыми, когда приложение загружается), onActivityCreated() ( onActivityCreated() после отображения макета и полезна, если вы делаете обработку данных после начала действия).

Чтобы упростить для вас, ниже приведена диаграмма жизненного цикла служебной деятельности:

введите описание изображения здесь

У меня была такая же проблема, вам нужно обновить свой стиль.

style.xml

   

Файл манифеста должен выглядеть следующим образом.

  // Other stuff  

Outout:

введите описание изображения здесь

Надеюсь, это поможет вам.

Оба свойства работают

   

Вы пытались инициализировать onActivityCreated ?

Внутри classа Application :

  registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { if(activity.getClass().equals(FirstActivity.class) { // try without runOnUiThread if it will not help activity.runOnUiThread(new Runnable() { @Override public void run() { new InitializatioTask().execute(); } }); } } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } }); 

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

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

Когда вы покажете заставку из вашего файла splash.xml, тогда эта проблема останется такой же,

Таким образом, вы должны создать стиль ont в файле style.xml для экрана заставки, и там вам нужно установить фон windows в качестве изображения всплеска, а затем применить эту тему к вашей активности всплеска из файла манифеста. Итак, теперь, когда вы запустите приложение, сначала он установит тему, и таким образом пользователь сможет видеть непосредственно заставку вместо белого экрана.

Рекомендуемый способ решения этой проблемы отсутствует в ответах. Поэтому я добавляю свой ответ здесь. Проблема с белым экраном при запуске возникает из-за начального пустого экрана, который системный процесс рисует при запуске приложения. Обычный способ решить это – отключить этот начальный экран, добавив это в ваш файл styles.xml .

 true 

Но согласно документации на Android, это может привести к увеличению времени запуска. Рекомендуемый способ избежать этого начального белого экрана в соответствии с google заключается в использовании windowBackground темы windowBackground и предоставления простой пользовательской возможности для начального действия.

Как это:

Файл Drawable Layout, my_drawable.xml

         

Создайте новый стиль в styles.xml

     

Добавьте эту тему в свою начальную деятельность в файле манифеста

  

И когда вы хотите перейти к обычной обычной вызове setTheme(R.style.Apptheme) перед вызовом super.onCreate() и setContentView()

 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { // Make sure this is before calling super.onCreate setTheme(R.style.Theme_MyApp); super.onCreate(savedInstanceState); // ... } } 

Это рекомендуемый способ решения проблемы, и это из шаблонов Google Material Design .

Просто напишите элемент в значениях / styles.xml:

 @android:color/black 

Например, в AppTheme:

  

Я бы рекомендовал взглянуть на ответ, указанный на этой странице . Решено использовать свойство Style. Это не беспокоит пользователя.

 Style :-  In Manifest :-       
  • Добавление элементов управления яркостью экрана в приложение для Android
  • Ошибка MediaPlayer -38,0
  • прозрачный экран в java
  • Java: ошибка: переменная не была инициализирована
  • Круглые до двух знаков после запятой
  • Сортировка коллекций (список , метод сравнения )
  • Android JDBC не работает: ClassNotFoundException на драйвере
  • Изменение цвета плавающей кнопки Android
  • Как вы реализуете FileObserver из службы Android
  • Как остановить задачу, запланированную в classе Java.util.Timer
  • Скрытие строк в Obfuscated code
  • Interesting Posts

    Зачем использовать redirect JSF ExceptionHandlerFactory вместо перенаправления ?

    NSURL вытаскивает одно значение для ключа в строке параметров

    Как скопировать ссылку на сообщение Mail.app без использования перетаскивания?

    VScode начинает отладку в интегрированном терминале вместо консоли отладки

    Прозрачная командная строка в Vista?

    Функция PostgreSQL для последнего вставленного идентификатора

    Как передать дополнительные аргументы в декоратор Python?

    Microsoft.Office.Interop.Excel действительно медленный

    Включить C ++ 11 в Eclipse CDT (Juno / Kepler / Luna) indexer

    В ручном прерывании CHKDSK / r в этот момент были изменены данные?

    Преобразование формата даты Java – получение неправильного месяца

    Показывать начальный ноль, если число меньше 10

    Есть ли все-таки, чтобы предотвратить ошибку «Outlook использует старый файл .ost»?

    Группа AngularJS по директиве без внешних зависимостей

    Почему C ++ STL настолько сильно зависит от шаблонов? (а не на * интерфейсах *)

    Давайте будем гением компьютера.