Multi-Window в Android N: Какво трябва да знаят разработчиците, за да се възползват максимално

Предоставяме общ преглед на това какво означава предстоящата поддръжка на няколко прозореца в Android N за разработчиците и как да се възползвате максимално от нея!

Поддръжката на няколко прозореца е добра функция, която чакаме в Android N и такъв, който отдавна искахме да бъде достъпен на всички устройства. За да бъде приятно изживяване обаче, разработчиците може да се наложи да направят някои промени в своите приложения, за да го поддържат правилно.

Една от сесиите на Google I/O беше за разработчиците да научат за новите API и промените в поведението на системата, които носи поддръжката на няколко прозореца.

Сесията беше представена от Wale Ogunwale, водещ технически мениджър за Android ActivityManager и Компоненти на рамката на WindowManager -- той и неговият екип са тези, които отговарят за многопрозорците в Android.

Можете да гледате на Сесия в режим Multi-Window в 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: минималните размери на дейността (режими на свободна форма и разделен екран)
Можете да намерите примерен код в. Примерно приложение на Playground с множество прозорци на Google в 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 Developers, ако се интересувате Картина в картина на 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 предложи някои най-добри практики, за да сте сигурни, че вашите потребители имат възможно най-доброто изживяване:
  • Режимът на дръжката се променя елегантно:
    • Поддържайте последователност на потребителския интерфейс, независимо от ориентацията. Не променяйте позициите на елементите, за да позволите плавни преходи.
    • Разширявайки горното, не превключвайте между много различни оформления за оформления на телефон/таблет. Вместо това адаптирайте оформлението на таблета за по-малки размери за последователност.
  • Уверете се, че вашите дейности се адаптират към малки размери от следвайки моделите на Material Design.
  • Използвайте FLAG_ACTIVITY_LAUNCH_ADJACENT когато има смисъл да се направи по-приятно изживяване в режим на разделен екран.
  • Обявявайте несъвместимост при преоразмеряване само когато е оправдано. Както обсъдихме по-горе, в противен случай приложението ви се откроява по лош начин.
Wale завърши сесията, като предложи някои допълнителни полезни ресурси:
  • Многопрозоречна документация.
  • Насоки за материален дизайн за режим на разделен екран.
  • Примерно приложение с няколко прозореца.