Приложения для складных и многоэкранных устройств
Как правило, приложения не должны полагаться на статические идентификаторы или логику, которая зависит от некоторых идентификаторов дисплея. В большинстве случаев приложения должны изменять размер и работать на разных дисплеях, а система должна контролировать, где размещать приложения. Например, чтобы создать новый уникальный интерфейс для складных устройств и запускать специальное приложение на внешнем экране, когда устройство сложено.
В этом случае SystemUI (или другой системный компонент) должен обнаружить складку, определить, уместно ли выполнить действие, а затем запустить целевое действие и указать идентификатор внешнего дисплея в качестве цели запуска. Приложения не должны обнаруживать это действие или выполнять какие-либо действия в ответ, а затем выполнять запуск на определенном дисплее. Другими словами, не думайте, что то, что работает на одном устройстве, будет работать и на других устройствах. Короче говоря, специфичный для устройства код увеличивает фрагментацию.
Ограничение доступа к дисплеям
Если конфигурация устройства требует ограничения доступа к одному или нескольким дисплеям, рекомендуется использовать флаг Display#FLAG_PRIVATE
для обозначения таких дисплеев как частных . Это ограничивает всех, кроме владельца, от добавления контента на дисплей. Любая попытка запустить действие или добавить окно кем-либо, кроме владельца, приводит к SecurityException
. Если система владеет дисплеем, она может добавлять окна и запускать действия.
Кроме того, объекты, размещенные на дисплее, всегда могут получить доступ к этому дисплею. Если владелец запускает действие на дисплее, то это действие может запускать другие действия на этом дисплее. В результате владелец несет ответственность за ограничение доступа и разрешение только доверенных приложений.
Кроме того, к виртуальным дисплеям добавляются дополнительные ограничения, поскольку любое приложение может создать их, не делая их видимыми для пользователя. Если виртуальный дисплей не принадлежит системе, разрешены только действия с allowEmbedded
, а вызывающий должен иметь разрешение ACTIVITY_EMBEDDING
.
Для получения дополнительной информации см.:
-
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
-
ActivityDisplay#isUidPresent()
-
DisplayManagerService#isUidPresentOnDisplay()
Для условного контроля запуска активности используйте LaunchParamsController
, который перехватывает все запуски активности и позволяет системному компоненту изменять параметры, используемые для запуска. Это доступно в system_server
.
Настройка параметров отображения окон и системных украшений
Системные украшения можно настроить для каждого дисплея в DisplayWindowSettings
. Реализация устройства может предоставить конфигурацию по умолчанию в /data/system/display_settings.xml
.
Это значение определяет, будут ли отображаться на дисплее системные украшения (лаунчер, обои, панель навигации и другие окна оформления) и IME. Дополнительные сведения см. DisplayWindowSettings#shouldShowSystemDecorsLocked()
и DisplayWindowSettings#shouldShowImeLocked()
.
Для идентификации дисплея используйте либо уникальный идентификатор (по умолчанию используется DisplayInfo#uniqueId
), либо идентификатор физического порта для аппаратных дисплеев (см. DisplayInfo#address
).
Например, следующий пример конфигурации дисплея включает системные декорации и IME на смоделированном дисплее:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="0" /> <display name="overlay:1" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
В приведенном выше примере, uniqueId
используется для идентификации дисплея в атрибуте имени, который для смоделированного дисплея — overlay:1
. Для встроенного дисплея примерным значением может быть "local:45354385242535243453"
. Другой вариант — использовать информацию об аппаратном порте и установить identifier="1"
, чтобы он соответствовал DisplayWindowSettings#IDENTIFIER_PORT
а затем обновить имя, чтобы использовать формат "port:<port_id>"
:
<?xmlversion='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="1" /> <display name="port:12345" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
Дополнительные сведения см. в разделе Идентификаторы статических дисплеев .
Для получения дополнительной информации см.: