Если пользователю придётся выбирать между двумя приложениями, схожими практически во всём, но различающимися поддержкой одновременной работы с несколькими окнами, неудивительно, что выберет он то, что такую поддержку обеспечивает.
Из статьи вы узнаете о многооконном режиме в Android, и о том, как использовать эту возможность при построении собственных приложений.
Обзор
Одновременная работа с несколькими окнами в Android – это интересная функция, которая способна выделить ваше приложение из множества других, дать ему дополнительное конкурентное преимущество. Многие OEM и ODM-производители, такие, как Samsung, Ramos и Huawei, подвергают базовую систему Android доработке. В частности, они внедряют поддержку многооконного режима. Делают они это для того, чтобы повысить привлекательность своих смартфонов и планшетов, выделить их из основной массы устройств, которые подобную функцию не поддерживают.
Сценарии использования многооконного режима
Предварительные сведения
В июне 2012-го года был представлен Cornerstone – первая платформа с открытым исходным кодом для организации многозадачной работы на Android. В августе 2012-го Samsung выпустила первый аппарат, поддерживающий работу в многооконном режиме. Начиная с 2013-го года и по наши дни, можно наблюдать взрывной рост решений для поддержки одновременной работы с несколькими окнами в Android.
В мае 2015-го года вышла Android M Developer Preview (сегодня, в июле, доступна уже Preview 2). Официальный релиз Android M (6.0) ожидается осенью 2015-го года. Кроме прочих новшеств Android M Preview 2 примечателен тем, что поддерживает многооконный режим.
Развитие решений для поддержки многозадачности в Android
Существуют два подхода к работе с несколькими окнами: это использование плавающих (floating) и закрепленных (docked) окон. Среди основных возможностей работы в многооконных режимах можно отметить открытие и закрытие окон (open/close), изменение их размера (resize) и взаимного расположения (swap). Открывая или закрывая окно, мы, соответственно, включаем или выключаем многооконный режим. Функция изменения размера предусматривает настройку размеров окон. Смена расположения окон – это действие, которое позволяет поменять их местами.
Режимы работы с несколькими окнами
В 2013-м году на рынке появилось множество решений, рассчитанных на работу с несколькими окнами. Они были разработаны OEM и ODM-производителями, независимыми поставщиками ПО и сообществом разработчиков программ с открытым исходным кодом. В таблице ниже вы можете найти сравнение различных технологий организации многооконной работы в среде Android.
Продукт | Cornerstone | Standout | Xposed | Tieto |
Описание |
Фреймворк для организации многозадачной работы в ОС Android |
Библиотека с открытым исходным кодом, которую можно использовать для создания приложений с плавающими окнами |
Многооконное приложение, которое поддерживает закрепленные окна |
Проект направлен на создание рабочей среды, напоминающей работу на настольном ПК |
Поддержка открытия, закрытия окон, изменения размера, раскрытия на весь экран |
Да |
Да |
Да |
Да |
Стиль окна |
Закрепленное |
Плавающее |
Закрепленное |
Закрепленное и плавающее |
Модификация кода |
На уровне платформы Android |
На уровне приложения |
На уровне платформы Android |
На уровне платформы Android |
Поддержка приложений |
Поддерживаются все приложения, однако, не доступна динамическая настройка SurfaceView. |
Некоторые вспомогательные приложения. Например – калькулятор. |
Совместимость и стабильность решения нуждается в улучшении. |
Поддерживает все приложения. |
Версия Android |
Android 4.1. – Android 4.4. |
Android 4.1. – Android 4.4. |
Android 4.4. |
Android 4.4 |
Официальный сайт |
Клик |
Клик |
Клик |
Клик |
Программная архитектура
Код платформы Android можно модифицировать для того, чтобы оснастить её поддержкой дополнительных возможностей. Архитектура ОС Android состоит из нескольких уровней.
В случае с Android 4.2 и Android 4.3., оболочка (launcher) и другие приложения при запуске размещаются в одном стеке, называемом «главный стек» («main stack»). Как известно, многооконный режим требует большего количества стеков для размещения в них нескольких окон. В результате, нужно модифицировать системный класс ActivityManagerService, добавив к нему интерфейс для создания стека и управления им. Для модификации класса платформы WIndowManagerService, который позволяет управлять графическими представлениями приложений, требуется изменить InputManager. Нужно это для того, чтобы он мог перенаправлять события касания соответствующим окнам.
С выходом Android 4.4 и Android 5.0 подход к управлению стеком значительно изменился. Оболочка и другие приложения могут запускаться в различных стеках. В систему была добавлена поддержка нескольких стеков и возможность управления ими. На рисунке ниже показаны отличия в работе со стеком в разных версиях Android.
Сравнение работы со стеком в Android 4.3 и Android 4.4
Теперь сосредоточимся на Android 5 (Lollipop). ОС Android использует механизмы обратного вызова для выполнения интерфейсных функций Activity. Однако управляющая функция реализована на уровне платформы. Поэтому сейчас мы рассмотрим два важных класса: ActivityManagerService и WindowManagerService.
Структура ПО платформы Lollipop
Управление Activity в Lollipop
Так как возможность работы в многооконном режиме зависит от стека, ниже показано, как можно создать стек и как можно запустить Activity в этом стеке. В Lollipop в интерфейс IactivityManager.java добавлены следующие функции:
Новые функции интерфейса IactivityManager.java | Описание |
public void moveTaskToStack(int taskId, int stackId, boolean toTop) | Переместить задачу (task) в другой стек |
public void resizeStack(int stackBoxId, Rect bounds) |
Изменить размер стека |
public void setFocusedStack(int stackId) |
Установить фокус на выбранную задачу |
Public Boolean isInHomeStack(int taskId) |
Узнать, находится ли задача в HomeStack |
После запуска процесс SystemServer вызывает службы управления Activity (activity manager services) и окнами (windows management services). Для того чтобы понаблюдать за этим процессом, мы можем добавить в соответствующие места команды вызова исключения времени выполнения (RuntimeException).
Процесс создания стека в Lollipop
Теперь посмотрим, как запустить Activity в стеке:
Запуск Activity в стеке
В Lollipop в утилиту ADB (Android Debug Bridge, отладочный мост Android) были добавлены следующие команды:
Команда ADB |
Функция |
Описание |
Adb shell am stack start |
Запускает новую Activity на <DISPLAY_ID>, используя Intent |
В Kitkat 4.4 команды ADB содержат: adb shell am stack create В Lollipop 5.0: adb shell am stack create deletion |
Adb shell am stack movetask |
Перемещает <TASK_ID> из текущего стека вверх или вниз стека <STACK_ID> |
Использование: adb shell am stack movetask task_id stackid true/false Примечание: в Kitkat это работает, а в Lollipop – нет |
Adb shell am stack resize |
Изменяет размер стека <STACK_ID> и его позицию на <LEFT, TOP, RIGHT, BOTTOM> |
Использование: adb shell am stack resize task_id weight |
Управление окнами в Lollipop
WindowManagerService – это центральная часть системы управления окнами. Его функциональность включает в себя диспетчеризацию событий ввода, управление расположением объектов на экране и поверхностями, на которых выводятся графические элементы.
Роль WindowsManagerService в графической архитектуре Android
Проблемы многооконного режима
При работе в многооконном режиме доступно изменение размеров окон. Известны примеры, когда размер окна, выводящего игровую анимацию, не может быть изменен. Основная причина этого заключается в том, что подсистема Android SurfaceFlinger не может динамически менять размер выводимого изображения.
Игры, использующие SurfaceFlinger, не могут динамически менять размер окна
Ещё одна проблема заключается в том, что некоторые приложения в многооконном режиме отображаются некорректно. На рисунке ниже вы можете видеть, что калькулятор в многооконном режиме отображается неправильно. Всё дело в макете приложения, который не рассчитан на подобные условия использования.
Калькулятор с макетом, не рассчитанным на работу в многооконном режиме
Поддержка многооконного режима в Android M
Android M Developer Preview 2 можно запустить на Nexus 5, 6, 9 и Nexus Player. Если же подобного устройства у вас нет, или вы не хотите устанавливать на него ОС, находящуюся в статусе Preview, с Android M можно познакомиться с помощью эмулятора в Android Studio. В частности, сейчас нас интересуют стандартные средства для работы в многооконном режиме.
Для того чтобы увидеть этот режим в действии, достаточно создать новое виртуальное устройство с помощью средства AVD Manager, выбрав при этом в качестве системного образа один из доступных с API Level MNC. В нашем случае это был образ x86_64. Далее, надо запустить эмулятор, перейти в раздел настроек Для разработчика и включить там опцию Многооконный режим. Если такой опции найти не удаётся, взгляните на это руководство
Теперь самое интересное. Для начала можно запустить несколько приложений, всё будет как обычно. А вот если нажать на кнопку вызова списка недавно открытых приложений, в заголовках миниатюр окон появится новый значок. По умолчанию это – рамка, указывающая на то, что приложение запускается в полноэкранном режиме. Если на этот значок нажать, появится меню выбора макета расположения окон.
Меню выбора макета расположения окон в многооконном режиме
Дальше всё вполне понятно. Выбираем нужный макет и наслаждаемся многооконным режимом:
Многооконный режим в Android M
Будет ли доступна работа с несколькими окнами в официальном релизе Android M, пока неизвестно. Однако, например, системный калькулятор в этом режиме чувствует себя хорошо. В результате, у нас есть серьёзные основания полагать, что не за горами тот день, когда адаптация приложений для многооконного режима из конкурентного преимущества превратится в насущную необходимость.
Если же вы хотите оснастить свои приложения, рассчитанные на более ранние версии Android, поддержкой нескольких окон, самое время обратиться к решениям сторонних разработчиков, о которых речь шла выше. Например, к Cornerstone.
Пример: Cornerstone
Компания Onskreen создала Cornerstone – первый фреймворк, позволяющий работать с несколькими окнами на Android. Он рассчитан на устройства с большими экранами и планшеты. Исходный код можно загрузить на Github. Он поддерживает работу с Android версий 4.1 и 4.2. Для более поздних версий этой ОС Cornerstone пока не выпущен. Однако можно проанализировать исходный код для Android 4.2 для того, чтобы узнать технические подробности работы системы.
Модификации Cornerstone в Android Jelly Bean
Итоги
Во многих мобильных устройствах, работающих под управлением Android OS, используются процессоры Intel®. Как разработчики могут улучшить ощущения пользователей от работы с их приложениями? Как сделать приложения более конкурентоспособными? Эти вопросы ведут нас к постоянному улучшению продуктов на устройствах с архитектурой Intel Architecture (IA). Поддержка работы в многооконном режиме – это хороший пример полезной возможности, дающей приложениям конкурентные преимущества. Это удобно, многооконный режим даёт пользователю возможность выполнять несколько задач одновременно. Например – смотреть видео и писать друзьям отзыв о том, что смотрит. Например – играть в игру и читать её обзоры. Сегодня работу в многооконном режиме поддерживают несколько устройств. Например – это планшеты Ramos i12, Teclast x98 и Cube i7, который работает под управлением Remix OS.
Многооконный режим на IA-устройствах
Для домашнего чтения
» Android 6.0 Muffin Concept Video Shows Multi-Windows, Quick Reply Feats
Спасибо за внимание!
Комментарии (4)
rPman
22.07.2015 23:58+8У меня одного складывается ощущение, что ситуация повторяется чуть ли не как было с DOS -> Windows, чуть ли не те же формулировки про конкурентные преимущества и новые возможности :)
Воистину, сначала отбери у человека что то, а затем с помпой ему это верни, и возлюбят тебя как никогда сильно :)dyadyaSerezha
24.07.2015 13:25Более того, десктопная Windows безуспешно пыталась осободиться от многооконности, настырно тыкая пользователю новый плиточно-однооконный интерфейс во все щели (вздрагиваю, вспоминая новый «мобильный» Скайп на моем 24-дюймовом мониторе) и, видимо, надеясь, что «еще год-два и все перейдут на плитки а тыканье пальцами в экран», а другие, даже не десктопные, а мобильные системы тем временем шли ровно в обратном направлении — привет, многооконность. :)
Кстати, кто-нибудь реально пользуется двумя окнами на телефоне? Я — никогда, хотя у меня эта возможность уже года 2-3 как есть.BRADA
28.07.2015 14:32Пробовал еще со времен выхода floating window для xposed… так и не нашел для себя применения на N5, и сейчас на DP2 тоже поигралс и отключил…
Очень нужно такое на 5.0+ (не считая М).
grafmishurov
Ну нам то ядро и HAL важнее. Тем более с Intel многое проще на уровне ядра (чем у MediaTek, например), в папке /arch/x86 основное все есть специфическое для архитектуры: нужные контрол-регистры типа CR0, CR3 для пейджинга и прочее. А окошечки, доки, десктопики, дашборды — то все уже дело наживное.