Реалізація Multi-Window для Android-додатку

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Реалізація Multi-Window для Android-додатку
Середній
~3-5 днів
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Впровадження Multi-Window для Android-додатків

Multi-Window — це режим розділеного екрана на Android 7.0+ (API 24) та режим «картинка в картинці» (Picture-in-Picture) для Android 8.0+ (API 26). Починаючи з Android 12, режим розділеного екрана за замовчуванням ввімкнено для всіх додатків, якщо явно не вимкнено через android:resizeableActivity="false". Це означає, що ваш додаток уже може бути на розділеному екрані у користувачів, і якщо він до цього не готовий — користувацький інтерфейс ламається.

Що означає «готовий до Multi-Window»

Додаток, що працює на розділеному екрані, отримує змінені розміри вікна кілька разів на секунду при рухові розділювача. Кожна така зміна викликає або onConfigurationChanged(), або пересоздання Activity (якщо android:configChanges не вказано). Якщо Activity пересоздається при кожному русі розділювача, користувачі бачать мигання та втрату стану.

Правильний підхід — оголосити в маніфесті, що Activity сама обробляє зміни конфігурації:

<activity
    android:name=".MainActivity"
    android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
    android:resizeableActivity="true" />

У onConfigurationChanged() перераховуйте layout без пересоздання—використовуйте WindowMetrics API (API 30+) або DisplayMetrics для старіших версій.

Адаптивний UI. З Jetpack Compose: використовуйте BoxWithConstraints або WindowSizeClass з androidx.window:window для визначення поточного класу вікна (Compact, Medium, Expanded). Не кодуйте жорстко «планшетний layout» на основі isTablet()—перевіряйте фактичний розмір доступного вікна, який у режимі розділеного екрана на планшеті може бути таким же, як на телефоні.

Picture-in-Picture

PiP активується через enterPictureInPictureMode(PictureInPictureParams). Типовий варіант використання — відеоплеєр. При переході до PiP:

val params = PictureInPictureParams.Builder()
    .setAspectRatio(Rational(16, 9))
    .setActions(listOf(
        RemoteAction(/* пауза/відтворення */),
        RemoteAction(/* наступна композиція */)
    ))
    .build()
enterPictureInPictureMode(params)

RemoteAction представляє кнопки, видимі у вікні PiP. Натискання надсилає PendingIntent—зазвичай BroadcastReceiver у Activity.

Проблема: onStop() викликається при переході до PiP. Якщо відеоплеєр зупиняється в onStop(), відтворення перериває. Рішення: перевіряйте isInPictureInPictureMode у onStop() і не зупиняйте плеєр.

override fun onStop() {
    super.onStop()
    if (!isInPictureInPictureMode) {
        player.pause()
    }
}

onPictureInPictureModeChanged() — колбек для оновлення UI: приховуйте кнопки керування у режимі PiP, показуючи лише вміст відео.

Перетягування елементів між вікнами

Починаючи з API 24, підтримується перетягування між додатками на розділеному екрані. Для отримання: використовуйте View.setOnDragListener() і обробляйте DragEvent.ACTION_DROP. Для ініціалізації: використовуйте View.startDragAndDrop() з ClipData. Починаючи з API 33, поліпшений DropHelper з androidx.draganddrop спрощує обробку різних типів MIME.

Режим Freeform

На ChromeOS та деяких пристроях Android додатки працюють у режимі freeform—довільний розмір вікна. android:resizeableActivity="true" плюс правильна обробка onConfigurationChanged — це необхідні умови. Тестування: Developer Options → Force desktop mode (на підтримуваних пристроях) або емулятор ChromeOS.

Бібліотека WindowManager (androidx.window:window:1.3.x) надає WindowInfoTracker з Flow<WindowLayoutInfo>—для складних пристроїв (Fold, Flip) це дозволяє вам реагувати на стан шарніра (напівзакрите, режим планшета). Для додатків, які повинні підтримувати пристрої Galaxy Z Fold, правильна адаптація неможлива без цієї бібліотеки.

Впровадження повної підтримки Multi-Window з PiP, адаптивним UI та тестуванням займає 3–5 днів. Вартість розраховується індивідуально після оцінки поточного стану коду користувацького інтерфейсу.