Робимо екран завантаження android додатки правильно

Splash Screen (прим. Тут і далі - екран завантаження) просто забирає ваш час, вірно? Як Android розробник, коли я бачу екран завантаження, я тут же уявляю як деякі погані розробники додають трьохсекундну затримку в коді.

Я повинен дивитися на якесь зображення в перебігу декількох секунд, і до тих пір я не можу використовувати додаток. І я повинен це робити кожен раз після запуску програми. Я знаю яка програма я запустив. Я знаю що воно робить. Просто дозвольте мені використовувати його!

Що рекомендує Google


Ви будете здивовані, дізнавшись що прихильники Google використовують Splash Screen. Це описано прямо ось тут. в специфікації до Material Design.

Так було не завжди. Google був проти Splash Screen, і навіть назвав його анти-паттернів.

Робимо екран завантаження android додатки правильно

Правильний Splash Screen


Я вважаю, що Google не суперечить сам собі. Старий рада і нові рекомендації добре поєднуються. (Тим не менш, все-таки не дуже хороша ідея використовувати екран завантаження який забирає час користувача. Будь ласка, не робіть так)

Однак, Android додатків потрібна деяка кількість часу для запуску, особливо при холодному запуску. Існує затримка яку ви не можете уникнути. Замість того щоб показувати порожній екран, чому б не показати користувачеві щось хороше? Саме за цей підхід Google і виступає. Не варто витрачати час користувача, але не показуйте йому порожній, не настроєних розділ додатка, коли він запускає його вперше.

Якщо ви подивіться на останні оновлення Google додатків, ви побачите подібний спосіб використання екрану завантаження. Наприклад, погляньте на додаток YouTube:

Реалізація Splash Screen

Реалізація Splash Screen правильним способом трохи відрізняється від того що ви можете собі приставити. Подання Splash Screen, який ви бачите, має бути готове негайно, навіть перш ніж ви можете роздути (прим. Inflate) файл макета у вашій Splash Activity (прим. Activity - активність, діяльність).

Тому ми не будемо використовувати файл макета. Замість цього ми вкажемо фон нашого Splash Screen в тлі теми своєї Activity. Для цього, спочатку необхідно створити XML drawable в res / drawable.


Тут я поставив колір фону і зображення.

Далі, ви повинні встановити цей drawable в якості фону для теми вашого Splash Screen Activity. Перейдіть в файл styles.xml і додайте нову тему для Splash Screen Activity:


У вашій новій SplashTheme встановіть в якості фону ваш XML drawable. І встановити цю тему в своїй Splash Screen Activity в вашому AndroidManifest.xml:


І, нарешті, ваш клас SplashActivity повинен перенаправити вас в ваше основне Activity:


Зверніть увагу, що ви не налаштовує вид для SplashActivity. Подання береться безпосередньо з теми. Коли ви задаєте вид вашої Splash Screen Activity через тему, він доступний негайно.

Якщо у вас є файл макета для вашої Splash Activity, він буде показаний тільки після того як ваш додаток буде повністю ініціалізувати, а це що дуже пізно. Адже ми хочемо щоб Splash Screen відображався тільки невеликий проміжок часу, до того як додаток буде ініціалізувати.

Робимо це правильно


Як тільки кроки вище завершені, ви отримаєте Splash Screen реалізований правильним шляхом:

Збройні цим знанням, змусьте ваш Splash Screen працювати правильно. Не витрачайте час користувачів даремно, але дайте їм те, на що їм буде приємно дивитися поки вони чекають.

ну, треба було показати Apple HIG цього замовнику. На всіх WWDC інженери зі сцени благають не робити саме Splash скріни. У Launch Screen в iOS зовсім інше завдання. Вони повинні зробити вигляд, що ваш додаток навпаки завантажується настільки швидко, що моментально показує елементи реального екрану, який з'явиться після завантаження. Ось, що дослівно говорить нам HIG

A launch screen appears instantly when your app starts up. The launch screen is quickly replaced with the first screen of your app, giving the impression that your app is fast and responsive. The launch screen is not an opportunity for artistic expression. It's solely intended to enhance the perception of your app as quick to launch and immediately ready for use. Every app must supply a launch screen.

Як завжди - почали «за здравіє», закінчили - «за упокій». Зробити нащадок основної теми з кастомними drawable - будь то лого або що-небудь інше - це «за здравіє». Застосовувати цю тему до абсолютно зайвої активують, яке більш ніяких функцій не виконує, і ставити це нікому не потрібне активують ланчера - це «за упокій». Навіщо городити город, адже запуск нехай і порожнього активують, яке тільки і робить, що редирект на основне (яке і повинно бути ланчера), в будь-якому випадку займає якийсь час і ресурси.
Тепер - дійсно правильний варіант. Стартову тему, яка показує лого, або що-небудь інше, що-б користувач не бачив білий екран, - потрібно застосовувати до ОСНОВНИМ активують вашого застосування, у якого Интент-фільтр налаштований як

Якщо у вас в цьому активують використовується розмітка, у якої є свій фон, який повністю закриває екран - цього вже достатньо. Якщо ж ні, то поміняти тему програмно - простіше простого - першої ж рядком в onCreate (не обов'язково саме першою, але зробити це необхідно до виклику super.onCreate):