Окна произвольной формы android

Как использовать скрытый режим рабочего стола на устройствах Android 10

Одной из самых ранних функций Android 10, появившихся в предварительных версиях для разработчиков, был режим десктопа, подобный Samsung DeX. К сожалению, эта функция была чуть больше, чем простой набор и скрыта глубоко в параметрах разработчика. Что еще хуже, Google Pixel 4 вообще не может использовать режим рабочего стола, поскольку Google отключил его «из коробки». Тем не менее, вы все равно можете использовать его на определенных смартфонах, таких как Essential Phone, OnePlus 7/7 Pro, OnePlus 7T/7T Pro и телефонах с видеовыходом через USB-C. Вот несколько полный список устройств, которые поддерживают вывод видео через USB-C. Наконец, вам понадобится переходник USB-C на HDMI. Не стесняйтесь забрать один из Амазонки. Добавьте Bluetooth-клавиатуру и мышь для более полного опыта. Теперь выполните следующие шаги:

  1. Включить параметры разработчика на вашем телефоне.
  2. Перейдите в «Настройки»> «Параметры разработчика» и прокрутите вниз, пока не дойдете до раздела «Приложения». Найдите переключатели под названием «включить окна произвольной формы» и «включить режим рабочего стола». включите их оба и перезагрузите телефон.
  3. Загрузите и установите этот APK, созданный изобретательным участником XDA Developers.
  4. После установки APKm перейдите в «Настройки»> «Приложения и уведомления»> «Приложения по умолчанию» и установите «Lawnchair» в качестве панели запуска по умолчанию.
  5. Подключите телефон к монитору/телевизору с помощью адаптера.
  6. Теперь вы увидите всплывающий интерфейс рабочего стола Android 10 на экране. Предоставьте TaskBar разрешения, которые он запрашивает, а именно «отображение поверх других приложений» и «доступ к использованию».

Теперь вы сможете использовать всю мощь своего смартфона в комплекте с клавиатурой/мышью. Он не имеет такого уровня блеска, как Samsung DeX или Huawei Easy Projection, но он справится с работой. Вы можете легко запустить многозадачность и работать на уровне, который был бы невозможен на дисплее смартфона. Неясно, почему Google не включил режим рабочего стола из выпуска Android 10. Смартфон, который превращается в ноутбук, побуждает пользователей покупать ноутбуки, и это может быть одной из причин.

Как понизить версию Android 11 Beta до Android 10 на телефонах Google Pixel

Источник

Как включить скрытый настольный режим в Android

Вычислительная мощность современных смартфонов давно приблизилась к компьютерам трёх-пятилетней давности, чем компании очень охотно бравируют на каждой презентации. Другое дело, что сценариев использования такой производительности пока не слишком много. Как правило, вендоры приводят в пример возможность съёмки и монтажа видео в формате 4K, работу с дополненной реальностью и, конечно же, игры. Однако Google решила, что смартфоны вполне годятся для того, чтобы использовать их в качестве альтернативы персональным компьютерам, а потому добавила в Android 10 специальный десктопный режим. Правда, почему-то забыла нарисовать для него собственный интерфейс.

В Android есть скрытый десктопный режим

Читайте также: Google неожиданно выпустила Android 10 для телевизоров

Разработчик Дэниел Блэндфорд спроектировал собственный лаунчер для десктопного режима Android 10 под названием Flow Desktop Launcher (скачать). Это первый инструмент, который не просто активирует настольный режим, но и обеспечивает её всеми интерфейсными элементами. Благодаря ему можно подсоединять совместимый смартфон к монитору и, запустив Flow Desktop Launcher, использовать образовавшуюся сборку в качестве более-менее полноценного компьютера. В этом режиме у пользователя появится возможность запускать все приложения, которые установлены на смартфон, но при этом взаимодействовать с ними при помощи клавиатуры или мыши.

Как включить десктопный режим в Android 10

Flow Desktop — лаунчер, который активирует десктопный режим в Android 10

У десктопного режима из Android 10 отсутствует собственный интерфейс, потому что он, как и флаги в Chrome, является экспериментальным нововведением, чью работу Google намерена тестировать ещё какое-то время. Видимо, тестирование проводится в закрытом режиме без привлечения участников со стороны. В противном случае, Google, вероятно, нарисовала бы какое-то подобие настольного интерфейса, чтобы дать пользователям возможность испытать новый режим и понять, во-первых, насколько он жизнеспособен в принципе, а, во-вторых, как именно его следует развивать, чтобы им хотелось пользоваться.

Читайте также: Я обновился до Android 10. Что изменилось

Несмотря на это, Google пропустила Flow Desktop Launcher в Google Play, дав независимому разработчику возможность активировать десктопный режим. Для его активации не потребуется получения рут-прав или других сколь-нибудь сложных манипуляций. Будет достаточно просто установить приложение, активировать режим разработчика, а затем включить функции Freeform Windows и Experimental Desktop Mode. После этого можно будет подключить смартфон к периферийным устройствам, чтобы взаимодействовать с интерфейсом, и пользоваться импровизированным компьютером.

Как превратить Android-смартфон в компьютер

По словам разработчика, Flow Desktop Launcher пока находится в тестовом режиме, а потому его стабильная работа не гарантируется на подавляющем большинстве устройств. Единственные смартфоны, под которые лаунчер адаптировался изначально, — это OnePlus 7T Pro, Essential Phone и те модели Samsung Galaxy, которые по умолчанию поддерживают режим DeX. Впрочем, это не значит, что на других аппаратах Flow Launcher работать не будет. Просто при использовании устройств других брендов могут возникать различные неполадки, препятствующие комфортной работе.

Читайте также:  Альтернатива апл вотч для андроид

Читайте также: Функции Android 10, которые мы так и не увидели

Внедрив в Android 10 десктопный режим, Google, по сути, дала добро на превращение смартфонов в компьютеры, признав их производительность. Даже если по умолчанию он будет реализован не слишком хорошо, производители усилиями своих разработчиков смогут сделать собственные, более продвинутые и совершенные версии режима. Правда, теперь осталось выяснить, когда режим будет окончательно готов. Ведь если Google не выпустит его вместе с Android 11, это будет серьёзное упущение и шанс для конкурентов представить что-нибудь своё.

Источник

Диалоговые окна в Android. Часть 1

Dialog

Dialog — это класс, принадлежащий Android SDK и помогающий нам, простым смертным программистам, работать с диалоговыми окнами в Android. Класс Dialog имеет 4 подкласса:

  • AlertDialog: это диалоговое окно для различных сообщений приложения, например «Вы хотите купить мое приложение?» или что то в этом роде. AlertDialog поддерживает три кнопки — утвердительную (OK), отрицательную (Cancel) и нейтральную (Later).
  • ProgressDialog: это диалоговое окно для отображения выполнения различных процессов, загрузки, например.
  • DatePickerDialog: диалоговое окно предлагает пользователю выбрать дату.
  • TimePickerDialog: диалоговое окно предлагает пользователю выбрать время

На первом из этого списка, AlertDialog мы и остановимся подробнее.

AlertDialog

Чтобы создать диалоговое окно AlertDialog нам в помощь потребуется экземпляр класса Builder:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
Теперь, когда у нас есть builder, мы можем «строить» свое собственное диалоговое окно. В параметры диалогового окна Вы можете написать множество различных параметров, но основными являются эти:

  • setTitle(int resID) — задает заголовок диалогового окна, принимает в качестве аргументов ссылку на ресурс или строку.
  • setMessage(int resID) — задает сообщение в диалоговом окне, также принимает ссылку на ресурс или строку.
  • setPositiveButton(int textID, DialogInterface.OnClickListener listener) — устанавливает на Вашем диалоговом окне утвердительную кнопку с текстом ресурса textID и слушателем listener. Методы setNegativeButton и setNeutralButton идентичны, с разницей в назначении кнопок.

Пример создания AlertDialog:

В этом примере я использовал setCancelable(true) — это разрешает пользователю закрывать диалоговое окно с помощью хардварной кнопки Back. Еще я создал слушателя для утвердительной кнопки и использовал метод create(). Метод create() возвращает готовое диалоговое окно с вашими параметрами как экземпляр класса AlertDialog.
Вот мы и создали диалоговое окно! Следующая задача — показать его пользователю. Вот тут есть несколько вариантов:

  • showDialog(AlertDialog dialog) — самый простой способ показать диалоговое окно, но начиная с версии 3.0 разработчики Android не рекомендуют пользоваться этим методом, и в результате вы получите предупреждение, которое можно обойти только @SurpressWarning, что есть не совсем хорошо.
  • AlertDialog dialog.show() — альтернативный способ показать окно, для этого в экземпляре dialog должен лежать результат метода Builder.create().

Второй метод нам подходит больше, но писать в основной активности кучу различных Buider и AlertDialog портит читабельность кода. Поэтому целесообразней вынести создание и обработку диалоговых окон в новый класс, например:

Единственная заметка по поводу этого кода будет про использования метода setView(View view) в диалоге IDD_SETTINGS. У AlertDialog как и у всех остальных диалоговых окон есть одна приятная особенность — им можно задавать собственные Layout, что позволяет полностью видоизменять диалоговые окна и их содержимое. Здесь есть один подводный камень: обработку элементов этого Layout вы должны будете производить именно в той Activity, где вызываете это диалоговое окно. Например я показываю диалоговое окно IDD_SETTINGS в MainActivity с Layout по имени settings:

Соответственно я загружаю это окно в MainActivity:

Метод initSettings класса MainActivity в данном случае будет выглядеть так:

Ну а дальше обрабатываете свои объекты как вам угодно.

Небольшой итог

1) Для большинства целей диалоговых окон подходит AlertDialog
2) AlertDialog может принимать вид layout с любыми объектами
3) Гораздо лучше использовать для диалоговых окон отдельный класс и пользоваться AlertDialog.show()
4) Обработка объектов кастомного layout производится в активности, вызвавшей диалог

В следующей части этой статьи пойдет речь о DialogFragment, который был включен в Android SDK начиная с 3.0 Honeycomb. Надеюсь эта статья поможет новичкам и не очень в своих квестах по завоеванию Google Play.

Источник

Русские Блоги

Многооконная реализация Android

Отключить APK разделенный экран-AndroidManifest.xml добавить атрибут: android: resizeableActivity = «false»

Метки:Android NMulti-окноВ прошломAndroidВ системе все действия выполняются в полноэкранном режиме. Если вы не установите эффект прозрачности, вы можете одновременно видеть только один интерфейс действий.

Но начиная с версии Android N (7.0), система поддерживает многооконный режим. Благодаря поддержке нескольких окон пользователи могут одновременно открывать и видеть интерфейс нескольких приложений. И система также поддерживает перетаскивание между несколькими приложениями. Эта функция очень полезна на устройствах с большим экраном.

Читайте также:  Android с готовой базой

В этой статье подробно объясняется реализация многооконной функции в системе Android.

Введение в многооконные функции

очертание

В Android появилась многооконная функция от Android N (7.0).

Для новых функций Android N, пожалуйста, смотрите здесь:Android 7.0 for Developers
Подробные инструкции по работе с несколькими окнами см. здесь:Multi-Window Support

Многооконный режим на Android N имеет три режима:

Режим разделенного экрана
Этот режим можно использовать на мобильных телефонах. Этот режим разделяет экран на две части и отображает интерфейс двух приложений одновременно. Как показано ниже:

2. Режим PIP
Этот режим в основном используется на телевизоре. В этом режиме окно воспроизведения видео всегда может отображаться на верхнем слое. Как показано ниже:

3. Режим свободной формы
Этот режим похож на наш обычный рабочий столОперационная системаОкно интерфейса приложения можно свободно перетаскивать и изменять его размер. Как показано ниже:

Жизненный цикл

Многооконный режим не влияет и не меняет жизненный цикл исходного действия.

В многооконном режиме несколько действий могут быть видны одновременно, но только одно действие является самым верхним, то есть действие, которое получает фокус.

Все остальные действия будут в состоянии «Приостановлено» (хотя они видны).
В следующих трех сценариях система уведомит приложение об изменении статуса и может обработать приложение:

  • Когда пользователь запускает приложение в многооконном режиме
  • Когда пользователь меняет размер окна действия
  • Когда пользователь меняет окно приложения из многооконного режима в полноэкранный режим

Как приложение обрабатывает изменения состояния, смотрите здесь:Handling Runtime ChangesЯ не буду повторять их здесь.

Связанный с разработчиком

Начиная с API уровня 24, Android предоставляет следующие механизмы для поддержки использования многооконных функций.

  • Манифест нового атрибута
    • android:resizeableActivity=[«true» | «false»]
  • Добавлен макет атрибута
    • android:defaultWidth,android:defaultHeight Ширина и высота по умолчанию в режиме произвольной формы
    • android:gravity Начальная гравитация в режиме произвольной формы
    • android:minWidth, android:minHeight Минимальная высота и ширина в разделенном экране и режиме произвольной формы

Вот пример кода:

  • Добавлен API
    • Activity.isInMultiWindowMode() Запрос, если это в многооконном режиме
    • Activity.isInPictureInPictureMode() Запросить, находится ли он в режиме «картинка в картинке»
    • Activity.onMultiWindowModeChanged() Уведомлять об изменении многооконного режима (вход или выход из многооконного режима)
    • Activity.onPictureInPictureModeChanged() Уведомлять об изменении режима «картинка в картинке» (вход или выход из режима «картинка в картинке»)
    • Activity.enterPictureInPictureMode() Вызовите этот интерфейс для входа в режим «картинка в картинке». Если система не поддерживает этот вызов, этот вызов является недействительным.
    • ActivityOptions.setLaunchBounds() Когда система уже находится в режиме произвольной формы, вы можете использовать этот параметр для управления размером вновь запускаемой операции. Если система не поддерживает этот вызов, этот вызов недействителен

    Перед перетаскиванием Android N система позволяет перетаскивать только в пределах действия. Но начиная с Android N, система поддерживает перетаскивание между несколькими действиями. Вот некоторые связанные API. Смотрите официальную документацию для конкретных инструкций.

    • DragAndDropPermissions
    • View.startDragAndDrop()
    • View.cancelDragAndDrop()
    • View.updateDragShadow()
    • Activity.requestDragAndDropPermissions()

    Связанные модули и основные классы

    В этой статье мы в основном сосредоточены на реализации многооконных функций. Основные классы и модули для реализации многооконных функций перечислены здесь.

    Путь к коду здесь относится к исходному пути AOSP. Чтобы узнать, как получить исходный код AOSP, смотрите здесь:Downloading the Source。

    Путь к коду: / frameworks / base / services / core /Java/com/android/server/am

    Путь к коду: / frameworks / base / services / core / java / com / android / server / wm

    Путь к коду: frameworks / base / core / java /

    Путь к коду: / frameworks / base / packages / SystemUI /

    Как следует из названия: Системный интерфейс, сюда входят: NavigationBar, StatusBar, Keyguard и т. Д.

    Для объяснения, классы, упомянутые здесь, будут использоваться непосредственно ниже. Если вы хотите увидеть исходный код для этих классов, посмотрите путь здесь.

    Реализация многооконной функции

    Реализация многооконной функции в основном зависит от двух системных служб ActivityManagerService и WindowManagerService, которые расположены в процессе system_server. Этот процесс является очень важным системным процессом в системе Android. Многие сервисы в рамках находятся в этом процессе.

    Весь AndroidархитектураЯвляется ли модель CS, приложением является Клиент, а процессом system_server является соответствующий Сервер.

    Многие API, вызываемые приложением, будут отправлены для обработки соответствующей системной службе в процессе system_server. Например, API-интерфейс startActivity в конечном итоге обрабатывается ActivityManagerService.

    Поскольку прикладная программа и system_server выполняются в отдельных процессах, запросы на системные службы должны выполнять межпроцессное взаимодействие (IPC) через Binder для завершения вызова и возврата результата вызова.

    Введение в два системных сервиса

    ActivityManagerService отвечает за управление деятельностью.

    Для каждого действия, созданного в приложении, в ActivityManagerService будет соответствующая ему ActivityRecord, этот ActivityRecord записывает состояние действия в приложении. ActivityManagerService будет использовать этот ActivityRecord в качестве идентификатора для планирования процессов Activity в приложении, таких как управление жизненным циклом.

    На самом деле ответственность ActivityManagerService выходит далеко за рамки его названия: ActivityManagerService отвечает за управление всеми четырьмя основными компонентами (Activity, Service, BroadcastReceiver, ContentProvider) и управление процессами приложения.

    WindowManagerService отвечает за управление окнами. В том числе:

    Подождите. Каждое действие будет иметь свое собственное окно, и в WindowManagerService будет соответствующий WindowState. WindowManagerService использует это для идентификации окон в приложении и использует это WindowState для хранения, запроса и управления состоянием окна.

    ActivityManagerService и WindowManagerService должны работать в тесном сотрудничестве, поскольку создание или уничтожение Activity включает создание и уничтожение объектов Actiivty и объектов окна. Эти два независимы и тесно связаны.

    Процесс запуска деятельности

    Процесс запуска действия в основном включает в себя следующие этапы:

    Данная статья не предназначена для подробного объяснения процесса запуска Activity, читателям, интересующимся этой частью контента, обращайтесь к другим материалам.

    Задача и стек

    Каждое действие в системе Android находится в задании. Задача может содержать несколько действий, и может быть несколько экземпляров одного и того же действия. В AndroidManifest.xml мы можем передатьandroid:launchModeДля управления экземпляром Activity в Task.

    Кроме того, в startActivity мы также можем передатьsetFlagДля управления экземпляром запущенного Действия в Задаче.

    Важность управления задачами также заключается в недавнем списке задач и заднем стеке. Когда вы вызываете многозадачность с помощью клавиши многозадачности (нажмите и удерживайте клавишу Home на некоторых устройствах и клавишу многозадачности на некоторых устройствах), вы фактически получаете список недавно запущенных задач из ActivityManagerService.

    Стек Back управляет логикой, к которой должен переходить Activity, когда вы нажимаете кнопку Back в Activity. Стеки заданий и задних уровней см. Здесь:Tasks and Back Stack。

    Фактически, во внутреннем управлении ActivityManagerService и WindowManagerService в дополнение к Task есть слой контейнера, который разработчик и пользователь приложения контейнера может не почувствовать или использовать, но это очень важно, то есть Stack. Далее мы увидим, что многооконное управление в системе Android построено на стеке.Структура данныхНа. Стек содержит несколько задач, а задача содержит несколько действий (окно). На следующем рисунке показано их отношение:

    Следует также отметить, что структуры Task и Stack в ActivityManagerService и WindowManagerService имеют взаимно-однозначное соответствие, и соответствующее отношение выглядит следующим образом:

    То есть каждый ActivityStack или TaskRecord в ActivityManagerService имеет соответствующий TaskStack и Task в WindowManagerService. Оба типа объектов имеют уникальные идентификаторы (id имеет тип int), и они связаны по id.

    Многооконный и Стек

    Люди, которые использовали macOS или Ubuntu, должны были использовать функцию виртуального рабочего стола, как показано на следующем рисунке:

    Здесь создается несколько «виртуальных рабочих столов», и они перечислены вверху. Каждый виртуальный рабочий стол может иметь одно или несколько окон приложений, и виртуальный рабочий стол можно переключать в целом.

    Чтобы поддерживать несколько окон, Android создает несколько стеков во время выполнения, и здесь стек похож на роль виртуального рабочего стола.

    Каждый стек будет иметь уникальный идентификатор. Эти идентификаторы стека определены в ActivityManager.java:

    /** First static stack ID. */

    public static final int FIRST_STATIC_STACK_ID = 0;

    /** Home activity stack ID. */

    public static final int HOME_STACK_ID = FIRST_STATIC_STACK_ID;

    /** ID of stack where fullscreen activities are normally launched into. */

    public static final int FULLSCREEN_WORKSPACE_STACK_ID = 1;

    /** ID of stack where freeform/resized activities are normally launched into. */

    public static final int FREEFORM_WORKSPACE_STACK_ID = FULLSCREEN_WORKSPACE_STACK_ID + 1;

    /** ID of stack that occupies a dedicated region of the screen. */

    public static final int DOCKED_STACK_ID = FREEFORM_WORKSPACE_STACK_ID + 1;

    /** ID of stack that always on top (always visible) when it exist. */

    public static final int PINNED_STACK_ID = DOCKED_STACK_ID + 1;

    Из этого мы можем знать, что система может содержать так много стеков:

    Следует отметить, что не все эти стеки создаются сразу после запуска системы. Он создается при необходимости. Как уже упоминалось выше, ActivityStackSupervisor отвечает за управление ActivityStack.

    С учетом вышеизложенных базовых знаний давайте подробнее рассмотрим три многооконных режима в системе Android.

    Режим разделенного экрана

    На телефонах Nexus 6P запуск и выход из режима разделенного экрана — длительное нажатие многозадачной виртуальной кнопки. На следующем рисунке показано, как запустить режим разделенного экрана на Nexus 6P:

    После активации режима разделенного экрана экран разделяется на две части. Открытое в данный момент приложение перемещается в верхнюю часть экрана (в левую сторону, если оно находится в горизонтальной ориентации), а все остальные открытые приложения перечислены ниже (если оно в горизонтальной ориентации, оно находится справа) в многозадачной форме.

    После этого, когда пользователь работает, нижняя половина экрана сохраняет исходный режим использования: вы можете запускать или выходить из приложения, вы можете переключаться после многозадачности, а приложение в верхней части остается неизменным. Как мы упоминали ранее, на самом деле приложение, которое зафиксировано в первой половине экрана, находится в Docked Stack (Id — 3), а нижняя половина экрана — предыдущий полноэкранный Stack, размер которого был изменен (Id — 1).

    Далее, давайте проследим за долгим нажатием кнопки многозадачности в качестве подсказки, чтобы выяснить, как активируется режим разделенного экрана: на самом деле, и NavigationBar (три виртуальные кнопки внизу экрана), и StatusBar (строка состояния вверху экрана) оба Это в SystemUI. Мы можем использовать это как вход для расследования.

    PhoneStatusBar#prepareNavigationBarView Пользовательский интерфейс инициализируется для NavigationBar. Также установите прослушиватели событий для кнопок здесь. Вот длинные слушатели событий нажатия для кнопок недавних задач, которые нас интересуют:

    Источник

    Читайте также:  Android emulator with nfc
Оцените статью