Одна из моих любимых функций в Android 7.0 Nougat — это поддержка параллельной работы нескольких приложений в новом мультиоконном режиме. Когда у пользователя открыто какое-то приложение и он при этом осуществляет долгое нажатие на кнопку переключателя приложений, тогда он может добавить второе приложение к первому, чтобы они помещались на дисплее одновременно и последовательно, и благодаря этому открывается путь для новых сценариев, таких как, например, сбрасывание или перетаскивание контента. На планшетах и других крупных устройствах за счёт этого также активизируется новый режим «произвольной формы», который позволяет приложениям прибывать в полностью измененном размере (fully re-sized). Готовые приложения по умолчанию должны иметь возможность воспользоваться преимуществами этого нового режима, так как Android Activities будут автоматически изменить размер приложения в правильных пропорциях, когда оно перейдёт в этот режим. Здесь представлены два приложения Xamarin.Android в новом мультиоконном режиме; одно разработано при помощи Xamarin.Forms, а другое — посредством традиционного Xamarin.Android.
Как видите, мультиоконный режим должен поддерживаться приложением по умолчанию, однако, существует множество других возможностей для оптимизации, то есть, для включения дополнительных функций, которые могут понравиться пользователям.
Настройка приложения
Существует несколько простых настроек для включения и отключения мультиоконного режима применительно ко всему приложению для одного из Activity при компиляции с API 24.
Если Вы используете субклассовое приложение, то можете добавить атрибут ResizeableActivity:
1 2 | //Entire application does not support split mode [Application (ResizeableActivity = false)] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | //MainActivity поддерживающее разделение экрана [Activity(Label = "Monkeys", ResizeableActivity = true, Name="com.refractored.monkeysapp.MainActivity", MainLauncher = true, LaunchMode = LaunchMode.SingleTop, Icon = "@drawable/ic_launcher")] //DetailActivity не поддерживает разделение экрана [Activity(Label = "Details", Name = "com.refractored.monkeysapp.DetailsActivity", ResizeableActivity = false, LaunchMode = LaunchMode.SingleTop, ParentActivity = typeof(MainActivity))] |
Если всё установлено правильно, тогда activity и приложение могут быть запущены в режимах разделенного экрана и произвольной формы. Если Вы указываете его в отдельном Activity и пользователь переходит к нему, тогда новое Activity вернётся в полноэкранный режим. Если Вы разрабатываете на API 24 и не устанавливали ранее этот атрибут, то вариант по умолчанию будет true.
Запуск Activities, расположенных бок о бок
Кроме того, если пользователь уже перешёл в сессию разделенного экрана, тогда есть возможность запуска расположенных параллельно приложений посредством добавления нескольких флагов в intent перед началом нового Activity:
1 2 3 4 5 6 7 8 9 10 11 | var intent = new Intent(this, typeof(DetailsActivity)); //Request that the new Activity launches adjacent if possible intent.AddFlags(ActivityFlags.LaunchAdjacent); //Required for adjacent activity mode intent.AddFlags(ActivityFlags.NewTask); //If you would like a new instance of an existing activity to be created. intent.AddFlags(ActivityFlags.MultipleTask); StartActivity(intent); |
Настройка конфигурации Activity
Начиная с Android 7.0 стал доступен новый атрибут макета, и его можно добавить к любому классу Activity, который определяет дополнительные параметры в то время, когда Activity находится в мультиоконном режиме. Вот пример определения местоположения с минимальными и дефолтными геометрическими параметрами (dimensions) в то время, когда Activity запущено в режиме произвольной формы:
1 2 3 4 5 6 7 8 9 10 11 | [Activity(Label = "Monkeys", ResizeableActivity = true, Name="com.refractored.monkeysapp.MainActivity", MainLauncher = true, LaunchMode = LaunchMode.SingleTop, Icon = "@drawable/ic_launcher")] [Layout (DefaultHeight = "500dp", DefaultWidth = "600dp", Gravity ="top|end", MinHeight = "450dp", MinWidth="300dp")] |
Определение мультиоконного режима
Иногда требуется включить или отключить части пользовательского интерфейса или функциональности, когда пользователь заходит в мультиоконный режим. Новое логическое значение IsInMultiWindowMode можно с лёгкостью обнаружить в любом Activity.
1 2 3 4 | if(IsInMultiWindowMode) { //Включаем или отключаем функционал } |
Сверх того, Вы можете узнавать о том, что пользователь зашёл или вышел из мультиоконного режима посредством переопределения при помощи метода OnMultiWindowModeChanged:
1 2 3 4 | public override void OnMultiWindowModeChanged(bool isInMultiWindowMode) { base.OnMultiWindowModeChanged(isInMultiWindowMode); } |
Заключение
При оптимизации под мультиоконный режим следует учитывать и ряд других вещей, как, например, поддержку перетаскивания и сбрасывания, а также все типы конфигураций, которые пользователи могут попытаться применить в отношении приложения. Непременно ознакомьтесь с официальной документацией Android по мультиоконному режиму, чтобы в полной мере изучить проверочный лист.
Автор: James Montemagno
Источник: Официальный блог Xamarin
Написать ответ