Багатовіконність в Android N: що потрібно знати розробникам, щоб отримати від них найкращі можливості

click fraud protection

Ми надаємо огляд того, що майбутня підтримка кількох вікон в Android N означає для розробників, і як отримати від цього найкращий результат!

Підтримка кількох вікон — чудова функція, яку ми чекаємо в Android N який ми давно хотіли бути доступним на всіх пристроях. Однак, щоб це було приємним досвідом, розробникам, можливо, доведеться внести деякі зміни у свої програми, щоб підтримувати їх правильно.

На одній із сесій Google I/O розробники дізналися про нові API та зміни в поведінці системи, які приносить підтримка кількох вікон.

Сесію представили Wale Ogunwale, провідний технічний менеджер для Android ActivityManager та Компоненти фреймворку WindowManager — він і його команда відповідають за багатовіконність на Android.

Ви можете спостерігати за Сеанс багатовіконного режиму на YouTube, але ми також надаємо тут огляд сесії.

N пропонує три різні багатовіконні режими:
  • Режим розділеного екрана: це режим, який доступний за замовчуванням. Як випливає з назви, він дозволяє відкривати дві програми пліч-о-пліч.
  • Режим довільної форми: виробники можуть увімкнути це на більших пристроях, що дозволяє користувачам вільно змінювати розмір дій на додаток до режиму розділеного екрана.
  • Режим «картинка в картинці».: призначений для пристроїв Android TV, цей режим призначений для роботи відеоплеєрів у закріпленому вікні, поки користувач взаємодіє з іншими програмами.
Режим розділеного екрана Android NРежим Android N PiP
Варто зауважити, що. ми вже розглядали багатовіконність на N і трохи критикували поточну систему. Маючи це на увазі, ми сподіваємося, що режим довільної форми трохи наблизиться до режиму «картинка в картинці», оскільки це матиме корисні програми на всіх пристроях.
Увімкнути підтримку кількох вікон у своїх програмах просто: вам не потрібно нічого робити, якщо ви вже націлилися на N. Якщо ви вирішите вимкнути багатовіконний режим, ви можете зробити це, налаштувавши. android: resizeableActivity атрибут активності у вашому маніфесті. false. Це слід робити, лише якщо це дійсно виправдано, оскільки це завжди погано виділяє вашу програму запуск у повноекранному режимі, навіть якщо користувач (або інший додаток) намагається запустити його в багатовіконному режимі режим. Важливо зазначити, що атрибути кореневої діяльності застосовуються до всіх дій у її стеку завдань. Іншими словами, якщо у вас є діяльність, яку можна запустити іншими програмами, переконайтеся, що вона підтримує багатовіконний режим оскільки ви не можете гарантувати, що інші програми запустять вашу діяльність у новому завданні за допомогою. Intent#FLAG_ACTIVITY_NEW_TASK .Підтримку режиму «картинка в картинці» необхідно декларувати явно через. android: supportsPictureInPicture атрибут. Зауважте, що цей атрибут ігнорується, якщо. android: resizeableActivity є. false Атрибути .Layout можна використовувати для встановлення розмірів і розташування за замовчуванням для вікон довільної форми або для визначення мінімальної ширини чи висоти як для режимів довільної форми, так і для режимів розділеного екрана:
  • android: defaultWidth/android: defaultHeight: стандартні розміри діяльності (режим довільної форми).
  • android: gravity: початкова позиція діяльності (режим довільної форми).
  • android: minimalWidth/android: minimalHeight: мінімальні розміри діяльності (довільна форма та режими розділеного екрану)
Ви можете знайти приклад коду в. Приклад програми Google Multi-Window Playground на GitHub: AndroidManifest.xml.
З появою підтримки кількох вікон вам може знадобитися ще раз перевірити кілька речей у ваших програмах, щоб переконатися, що вони працюють правильно.

Розуміння життєвого циклу діяльності

The. життєвий цикл діяльності не змінюється в багатовіконному режимі: Базовий життєвий цикл активності Android З огляду на це, деякі незначні відмінності між станами активності можуть призвести до ненавмисної поведінки, яку ви зазвичай не помічаєте до N. Це важливо знати. Activity#onResume() і. Activity#onPause() викликаються, коли ваша програма отримує або втрачає фокус, але не обов’язково, коли вона починає або перестає бути видимою. (Пам’ятайте, що лише одна програма може мати фокус у будь-який момент часу.) Для програм, які постійно оновлюють вміст (наприклад, відтворення відео), переконайтеся, що запускаєте та зупиняєте оновлення вмісту. Activity#onStart() і. Activity#onStop() замість цього. Не робити цього для відеопрограм, наприклад, означатиме, що відтворення відбуватиметься, лише якщо програму сфокусовано, що перешкоджає використанню багатовіконного режиму. В офіційному додатку YouTube виникла подібна проблема під час першого запуску Android N Developer Preview.

Обробка змін середовища виконання

Коли програма переходить у багатовіконний режим, деякі конфігурації пристрою змінюються. Ви можете або дозволити перезапуск вашої діяльності (у цьому випадку. збереження фрагментів може бути гарною ідеєю, якщо ваша діяльність має виконувати інтенсивну операцію під час запуску), або виберіть це. явно обробляти зміни конфігурації замість цього. Чотири конфігурації пристрою можуть змінюватися під час входу або в багатовіконному режимі: screenSize, smallestScreenSize, screenLayout і. orientation. Зверніться до. Документація розробників Android для отримання додаткової інформації про кожен атрибут, але зауважте, що. orientation у цьому випадку більше не стосується орієнтації пристрою. Натомість він лише вказує, чи є ширина вашої дії більшою за висоту (альбомна орієнтація) або не (портрет). Оголосити, що ваша діяльність оброблятиме ці зміни, можна зробити з маніфесту:
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
Майте на увазі, що це означає, що вам потрібно буде внести ці зміни. Activity#onConfigurationChanged(), вручну оновлюючи перегляди або перезавантажуючи деякі ресурси.

Вимкнені функції в багатовіконному режимі

Деякі функції системи не залежатимуть від ваших дій у багатовіконному режимі:
  • Зміни панелі стану та навігаційної панелі, як-от затемнення/приховування системних панелей або використання режиму занурення, не матимуть ефекту. Це має сенс, оскільки ваша діяльність займає лише частину екрана.
  • The android: screenOrientation Атрибут активності також не впливає на багатовіконний режим: оскільки ваша діяльність буде змінювати розмір, більше не має сенсу мати фіксовану орієнтацію.
Додано нові зворотні виклики для багатовіконних подій, а також методи для запиту поточного стану.
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): викликається, коли стан активності змінюється з повноекранного на багатовіконний і навпаки.
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): викликається, коли стан активності змінюється на або з режиму PIP.
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): повертає, чи діє активність у режимі багатовіконності/картинки в картинці чи ні.
  • Activity#overlayWithDecorCaption(boolean overlay): для вікон довільної форми цей метод можна використовувати, щоб заголовок (смуга, яка використовується для перетягування вікна) накладав вміст замість того, щоб натискати його вниз.
PS. Окрім. Activity#overlayWithDecorCaption(), ці методи також передбачені. Fragment клас.

Запуск дій у багатовіконному режимі

  • Activity#enterPictureInPictureMode() можна використовувати для переведення діяльності в режим «картинка в картинці». Зауважте, що дії в режимі PiP не отримують сповіщення про події введення – використовуйте MediaSession#setMediaButtonReceiver() якщо ви хочете впоратися з такими подіями. Також обов’язково відвідайте веб-сайт розробників Android, якщо вас це цікавить Картинка в картинці на Android N.
  • Якщо пристрій у режимі розділеного екрана, ви можете наказати системі запустити іншу дію поруч із вашою, використовуючи Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT прапор. Прапор не діє, якщо не в режимі розділеного екрана.
  • Якщо пристрій у режимі довільної форми, ActivityOptions#setLaunchBounds() можна використовувати для визначення розмірів і розташування нової дії на екрані.
Щоб отримати приклади коду, перегляньте приклад програми Multi-Window Playground: приклад суміжної діяльності, приклад меж запуску.

Перетягни та Впусти

Хоча підтримка перетягування існує ще з Honeycomb, раніше вона була можлива лише в межах однієї діяльності. Це зараз. підтримується в багатовіконному режимі так само. Реалізація цього, здається, є. здебільшого те саме, що й раніше, з кількома доповненнями для перетягування між діяльністю:
  • View#startDragAndDrop()
    • Новий псевдонім для View#startDrag().
    • Щоб увімкнути перетягування між діяльністю, передайте новий прапорець View#DRAG_FLAG_GLOBAL.
    • Якщо вам потрібно надати дозволи URI для діяльності одержувача, передайте нові позначки View#DRAG_FLAG_GLOBAL_URI_READ або View#DRAG_FLAG_GLOBAL_URI_WRITE, в міру необхідності.
  • View#updateDragShadow()
    • Замінює тінь перетягування для операції перетягування, яка зараз виконується. Може викликатися лише програмою, яка ініціювала операцію перетягування.
  • View#cancelDragAndDrop()
    • Скасовує поточну операцію перетягування. Може викликатися лише програмою, яка ініціювала операцію перетягування.
  • Перевірити, чи підтримує пристрій режими довільної форми або «картинка в картинці», можна за допомогою PackageManager#hasSystemFeature(), використовуючи PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT і PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE відповідно.
  • The android: windowBackground Атрибут можна використовувати як фоновий малюнок, якщо розмір дії змінюється, а його рендеринг відстає. Якщо android: windowBackground не встановлено, android: windowBackgroundFallback замість нього використовується. Зверніться до прикладу програми Multi-Window Playground.
Wale запропонував кілька передових методів, щоб переконатися, що ваші користувачі мають найкращий досвід:
  • Режим ручки елегантно змінюється:
    • Підтримуйте узгодженість інтерфейсу користувача незалежно від орієнтації. Не змінюйте положення елементів, щоб забезпечити плавні переходи.
    • Розширюючи вищезазначене, не перемикайтеся між дуже різними макетами для макетів телефону/планшета. Натомість адаптуйте макет планшета для менших розмірів для узгодженості.
  • Переконайтеся, що ваша діяльність адаптована до малих розмірів за дотримуючись шаблонів матеріального дизайну.
  • використання FLAG_ACTIVITY_LAUNCH_ADJACENT коли є доцільним зробити приємніший досвід у режимі розділеного екрана.
  • Заявляйте про несумісність зміни розміру лише тоді, коли це обґрунтовано. Як ми обговорювали вище, інакше це погано виділяє вашу програму.
Wale завершив сесію, запропонувавши додаткові корисні ресурси:
  • Багатовіконна документація.
  • Рекомендації щодо матеріального дизайну для режиму розділеного екрана.
  • Зразок багатовіконної програми.