Режимът на прозорец със свободна форма на Android Nougat: какво представлява и как разработчиците могат да го използват

Режимът на много прозорци в свободна форма е недостатъчно използвана и недооценена функция в Android Nougat. Ние обясняваме какво е това и как разработчиците могат да го включат.

Режим на прозорец със свободна форма, както беше демонстрирано за първи път от Ars Technica

Когато Android 7.0 Nougat беше обявен за първи път в началото на 2016 г., той донесе със себе си една много търсена функция за платформата Android – поддръжка на няколко прозореца. Повечето хора знаят за поддръжката на няколко прозореца на разделен екран, активирана по подразбиране на всички телефони и таблети с Android Nougat. Устройствата с Android TV с Android Nougat се предлагат с поддръжка за поддръжка на няколко прозореца картина в картина.

В Android Nougat обаче има трети режим с много прозорци, за който не много хора знаят: режим на прозорец със свободна форма. Този режим позволява на Android да представя приложенията като плаващи прозорци, които могат да се местят и преоразмеряват по желание от потребителя. По същество това е внедряване на a мениджър на прозорци за подреждане.

В Документация за Android SDK, се посочва, че:

Производителите на по-големи устройства могат да изберат да активират режим на свободна форма, в който потребителят може свободно да преоразмерява всяка дейност. Ако производителят активира тази функция, устройството предлага режим на свободна форма в допълнение към режима на разделен екран.

И също така, в Android 7.0 CDD:

Реализациите на устройства с размер на екрана xlarge ТРЯБВА да поддържат режим на свободна форма.

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

Това обаче абсолютно не е трудно изискване. Възможно е да се принуди всякакви Устройство с Android Nougat (с активирани опции за разработчици) за поддръжка на режим на прозорец със свободна форма, като използва един от два различни метода:


Активиране на режим на прозорец със свободна форма на всяко устройство с Android Nougat

Включването на опцията „Принудително преоразмеряване на дейностите“ позволява на приложенията да работят в режим на свободна форма на всяко устройство

Метод 1 (изисква се компютър с adb)

Уверете се, че USB отстраняването на грешки е активирано в Опции за разработчици. След това свържете устройството си към компютър с инсталиран adb и изпълнете следната команда:

adb shell settings put global enable_freeform_support 1

Метод 2 (без допълнителни изисквания)

Активирайте опцията „Принудително преоразмеряване на дейностите“ в долната част на Опции за разработчици.

И двата метода изискват потребителският интерфейс на системата да бъде рестартиран, преди да влязат в сила. Най-лесният начин да направите това е да рестартирате устройството си (или, ако устройството ви е руутнато, можете просто да убиете com.android.systemui процес)


Добре, значи режимът на свободна форма е активиран... сега какво?

Ако сте активирали режим на свободна форма с помощта на метод 1, тогава ще има нов бутон върху записите на приложения в менюто Обзор за стартиране на приложение в режим на прозорец със свободна форма.

С метод 2 обаче не е възможно да стартирате приложение в режим на свободна форма през самия Android. за щастие възможно е всеки стартер на трета страна да стартира приложение в режим на прозорец със свободна форма използвайки стандартни API за Android, които бяха финализирани като част от API ниво 24.

Ключът към стартирането на приложение в режим на свободна форма е да извикате ActivityOptions.setLaunchBounds() метод. Този метод отнема a Rect като аргумент, съдържащ границите на прозореца, с които ще се стартира приложението.

След това можете да стартирате приложението с startActivity(Intent, Bundle). Ако все още нямате ActivityOptions пакет, можете да създадете такъв с ActivityOptions.makeBasic() и след това се обаждам setLaunchBounds() върху прясно създадения пакет.

Имайте предвид, че по подразбиране, ако вече има задача за приложението в екрана Общ преглед, тогава Android просто ще ви пренасочи към съществуващата задача (на цял екран), която преди това е била стартирана от потребител. Ще трябва да изчистите всички задачи за приложението в Общ преглед, преди да опитате да стартирате приложението в прозорец със свободна форма. (За приложения с дейности, които се стартират в standard или singleTop режими, можете принудително да се отвори нов прозорец, като добавите Intent.FLAG_ACTIVITY_MULTIPLE_TASK флаг за намерението преди извикване startActivity().)


Как работи режимът на свободна форма под капака?

Има отлична статия написано, което обяснява как режимът с множество прозорци, включително режимът на свободна форма, е внедрен в Android Nougat. (ЗАБЕЛЕЖКА: статията е написана на китайски, така че не забравяйте да я пуснете през Google Translate)

Накратко, приложенията в режим на свободна форма се изпълняват в отделен стек от останалата част от системата (помислете: виртуален десктоп). Следователно не е възможно приложенията със свободна форма да се изпълняват върху стартовия панел или върху друго приложение на цял екран.

Приложения, работещи в режим на свободна форма (които нямат android: windowIsFloating зададено на true) имат a DecorCaptionView добавен като дете на най-високо ниво DecorView. Този изглед съдържа a LinearLayout определяне на лентата с надписи на прозореца за преместване, увеличаване и затваряне на прозореца. Въпреки че не го препоръчвам лично, е възможно да получите достъп и да персонализирате този изглед, като получите DecorView използвайки Window.getDecorView(), хвърляйки го на a ViewGroup и след това достъп до неговите дъщерни изгледи.

Всяко приложение, което е проектирано да се държи добре в стандартния режим на разделен екран с множество прозорци на Android, ще работи в режим на свободна форма. isInMultiWindowMode() ще върне true за приложения, работещи в режим на свободна форма. Има няколко други публично достъпни класа и метода, които приложението може да използва и които се отнасят конкретно до режима на свободна форма:

  • Window.setDecorCaptionShade(): този метод може да се използва за замяна на сянката на контролите за надписи (бутона за увеличаване и затваряне) за приложения в режим на свободна форма.
  • Window.setRestrictedCaptionAreaListener(): това може да се използва за откриване, когато прозорец се движи в режим на свободна форма. The Window.OnRectrictedCaptionAreaChangedListener се извиква всеки път, когато позицията на контролите за надписи се промени (когато потребител мести прозореца) и предоставя a Rect с новите граници на контролите за надписи.
  • ActivityInfo.WindowLayout: този клас съдържа информация, декларирана в манифеста на приложението за първоначалното позициониране на прозорец със свободна форма, който приложението може да поиска при стартиране. Например можете да изброите следното в етикет на вашия манифест:
     android: defaultHeight="640dp"
    android: defaultWidth="360dp"
    android: gravity="center" />
    След това, когато устройството вече е в режим на свободна форма и приложението е стартирано, то ще се стартира с тези зададени граници.

Примери за режим на прозорец със свободна форма в действие

Лентата на задачите добавя стартово меню и област с последните приложения, за да допълни режима на прозорец със свободна форма

През лятото на 2016 г., докато Android Nougat все още беше предварителен преглед за разработчици, пуснах приложение, наречено Лента на задачите който предоставя подобно на Windows стартово меню и списък с скорошни приложения в системно наслагване. Той позволява на потребителите на Nougat да стартират приложения в режим на прозорец със свободна форма — и тъй като лентата на задачите използва наслагване, тя може да остане на екрана в средата на прозорец със свободна форма. Комбинацията от лента на задачите и режим на свободна форма дава на всяко устройство с Android, особено таблети, усещане като за компютър.

Можеш изтегляне на лентата на задачите в Google Play или вижте изходния код себе си в GitHub. В допълнение към концепциите, споменати в тази статия, използвам и няколко трика, за да поддържам средата на режима на свободна форма активна дори когато на екрана не се показват прозорци със свободна форма. Потребителите могат също по желание да зададат лентата на задачите като техен стартер по подразбиране, за да позволят на устройството си да стартира автоматично в средата на режим на свободна форма.

Тъй като няма устройства, които официално се доставят с поддръжка на прозорци със свободна форма, активирана от OEM (от момента на писане), препоръчвам използване на лентата на задачите като инструмент за разработчиците да тестват приложенията си в среда на прозорец със свободна форма на устройства, които иначе не поддържат то.

В допълнение към лентата на задачите, модифицирах и изходния код на Launcher3 от AOSP, за да му позволя да стартира приложения в режим на свободна форма. Това е прав клонинг на стандартния стартер на Android 7.1.1, с минималните модификации, необходими, за да може да стартира приложения в свободна форма. Предоставих този модифициран стартер с надеждата, че други разработчици ще внедрят поддръжка за стартиране на прозорци със свободна форма в техните персонализирани стартери. Можеш вижте изходния код на GitHub, или изтеглете примерен APK.

Надявам се, че разработчиците на персонализирани стартери могат да използват този код и да активират поддръжка за стартиране на свободна форма приложения за прозорци за онези потребители, които желаят по-голяма гъвкавост за управление на прозорци на своите големи екрани устройства.