Предоставяме общ преглед на това какво означава предстоящата поддръжка на няколко прозореца в Android N за разработчиците и как да се възползвате максимално от нея!
Поддръжката на няколко прозореца е добра функция, която чакаме в Android N и такъв, който отдавна искахме да бъде достъпен на всички устройства. За да бъде приятно изживяване обаче, разработчиците може да се наложи да направят някои промени в своите приложения, за да го поддържат правилно.
Една от сесиите на Google I/O беше за разработчиците да научат за новите API и промените в поведението на системата, които носи поддръжката на няколко прозореца.
Сесията беше представена от Wale Ogunwale, водещ технически мениджър за Android ActivityManager и Компоненти на рамката на WindowManager -- той и неговият екип са тези, които отговарят за многопрозорците в Android.
Можете да гледате на Сесия в режим Multi-Window в YouTube, но тук предоставяме и преглед на сесията.
- Режим на разделен екран: това е режимът, който е наличен по подразбиране. Както подсказва името, той ви позволява да отваряте две приложения едно до друго.
- Режим на свободна форма: производителите могат да активират това на по-големи устройства, което позволява на потребителите свободно да преоразмеряват дейностите в допълнение към режима на разделен екран.
- Режим картина в картина: насочен към устройства с Android TV, този режим е предназначен за видео плейъри, които да работят в фиксиран прозорец, докато потребителят взаимодейства с други приложения.
android: resizeableActivity
атрибут за дейност във вашия манифест към. false
. Това трябва да се прави само ако е наистина оправдано, тъй като винаги кара приложението ви да се откроява по лош начин стартиране в режим на цял екран, дори ако потребителят (или друго приложение) се опита да го стартира в режим на няколко прозореца режим. Важно е да се отбележи, че атрибутите на основна дейност се прилагат за всички дейности в нейния стек от задачи. С други думи, ако имате дейност, която може да се стартира от други приложения, уверете се, че поддържа режим на няколко прозореца тъй като не можете да гарантирате, че други приложения ще стартират вашата дейност в нова задача, използвайки. Intent#FLAG_ACTIVITY_NEW_TASK
.Поддръжката на режим "картина в картина" трябва да бъде декларирана изрично чрез. android: supportsPictureInPicture
атрибут. Имайте предвид, че този атрибут се игнорира, ако. android: resizeableActivity
е. false
Атрибутите .Layout могат да се използват за задаване на размери и разположение по подразбиране за прозорци със свободна форма или за указване на минимална ширина или височина както за режимите на свободна форма, така и за режимите на разделен екран: -
android: defaultWidth
/android: defaultHeight
: размерите по подразбиране на дейността (режим на свободна форма). -
android: gravity
: началната позиция на дейността (режим на свободна форма). -
android: minimalWidth
/android: minimalHeight
: минималните размери на дейността (режими на свободна форма и разделен екран)
Разбиране на жизнения цикъл на активността
The. жизнен цикъл на дейността не се променя в режим на няколко прозореца: Като се има предвид това, някои фини разлики между състоянията на активност могат да доведат до нежелано поведение, което обикновено не бихте забелязали преди 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)
: за прозорци със свободна форма този метод може да се използва, за да накарате надписа (лентата, използвана за плъзгане на прозореца) да наслагва съдържанието, вместо да го натиска надолу.
Activity#overlayWithDecorCaption()
, тези методи също се предоставят от. Fragment
клас. Стартиране на дейности в режим на няколко прозореца
-
Activity#enterPictureInPictureMode()
може да се използва за поставяне на дейност в режим картина в картина. Имайте предвид, че дейностите в режим PiP не получават известия за входни събития - използвайтеMediaSession#setMediaButtonReceiver()
ако искате да се справите с такива събития. Също така не забравяйте да проверите уебсайта на Android Developers, ако се интересувате Картина в картина на Android N.
- Ако устройството е в режим на разделен екран, можете да кажете на системата да стартира друга дейност до вашата, като използвате
Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT
знаме. Флагът няма ефект, ако не е в режим на разделен екран. - Ако устройството е в режим на свободна форма,
ActivityOptions#setLaunchBounds()
може да се използва за определяне на размерите и местоположението на новата дейност на екрана.
Влачите и пускате
Докато поддръжката за плъзгане и пускане съществува от 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 за пример.
- Режимът на дръжката се променя елегантно:
- Поддържайте последователност на потребителския интерфейс, независимо от ориентацията. Не променяйте позициите на елементите, за да позволите плавни преходи.
- Разширявайки горното, не превключвайте между много различни оформления за оформления на телефон/таблет. Вместо това адаптирайте оформлението на таблета за по-малки размери за последователност.
- Уверете се, че вашите дейности се адаптират към малки размери от следвайки моделите на Material Design.
- Използвайте
FLAG_ACTIVITY_LAUNCH_ADJACENT
когато има смисъл да се направи по-приятно изживяване в режим на разделен екран. - Обявявайте несъвместимост при преоразмеряване само когато е оправдано. Както обсъдихме по-горе, в противен случай приложението ви се откроява по лош начин.
- Многопрозоречна документация.
- Насоки за материален дизайн за режим на разделен екран.
- Примерно приложение с няколко прозореца.