Ofereça suporte a várias janelas

No Android 7.0 e versões mais recentes, os dispositivos podem mostrar vários apps simultaneamente usando o recurso de várias janelas. O Android oferece suporte a três configurações de várias janelas:

  • Livre:permite que os usuários redimensionem dinamicamente os painéis de atividades e tenham mais de dois apps visíveis na tela. Com o modo janela para computador, os usuários podem criar janelas de formato livre em um computador que oferece interações no estilo desktop.
  • Tela dividida:a implementação padrão de várias janelas, que fornece dois painéis de atividades em que os usuários podem colocar apps.
  • Picture-in-picture (PiP):permite que dispositivos Android reproduzam conteúdo de vídeo em uma janela pequena enquanto o usuário interage com outros apps.

Requisitos de dispositivos com várias janelas

O suporte a várias janelas é ativado por padrão no Android 7.0 e versões mais recentes. Para desativar, defina a flag config_supportsMultiWindow como false no arquivo config.xml do dispositivo.

Várias janelas é desativado por padrão em todos os dispositivos com pouca RAM (dispositivos que declaram ActivityManager.isLowRam). Esses dispositivos ignoram o valor da flag config_supportsMultiWindow.

Formato livre

O redimensionamento livre permite que o usuário crie janelas que podem ser redimensionadas livremente. O janelamento de forma livre é um pré-requisito para o modo janela para computador. Os requisitos de dispositivo para ativar o janelamento de forma livre são os seguintes:

  • Ative a flag config_supportsMultiWindow.
  • Ative o gerenciamento de janelas de forma livre de uma das seguintes maneiras:
    • Ative a flag config_freeformWindowManagement em config.xml:
      <feature name="android.software.freeform_window_management" />
    • Inclua o seguinte no makefile do dispositivo:
      PRODUCT_COPY_FILES += \
      frameworks/native/data/etc/android.software.freeform_window_management.xml:$(TARGET_COPY_OUT_SYSTEM)/etc/permissions/android.software.freeform_window_management.xml

No Android 16, os OEMs podem oferecer suporte ao modo janela para computador no dispositivo para uma configuração de várias janelas de forma livre usando a opção Ativar modo janela para computador.

Modo janela para computador

O modo janela para computador oferece um espaço de trabalho para multitarefa em telas grandes, criado com base em janelas de formato livre. O espaço de trabalho fica ao lado da tela cheia, com outros recursos e comportamentos da interface que oferecem ao usuário uma experiência de multitarefa mais flexível:

  • Interação com teclado ou mouse:oferece suporte a interações com prioridade para toque e com prioridade para teclado ou mouse.
  • Janelas de formato livre:executam apps em janelas redimensionáveis e móveis com barras de legenda e controles.
  • Barra de tarefas aprimorada:oferece acesso fácil a apps em execução e fixados.
  • Otimização de telas externas:transforma monitores conectados em ambientes de computador para dispositivos compatíveis.
  • Espaços de trabalho virtuais:permite que os usuários organizem apps em vários espaços de trabalho.

Atenda aos seguintes pré-requisitos para configurar um dispositivo para janelas de computador:

  • Ative as seguintes flags:
    • Todos os pré-requisitos para janelas de formato livre
    • A flag global do modo janela para computador config_isDesktopModeSupported
  • A interface do sistema requer uma tela com pelo menos 600 dp de largura. O modo janela para computador pode não funcionar como esperado em telas menores.
  • O dispositivo não pode ter pouca memória RAM. ActivityManager.isLowRam precisa retornar false, já que dispositivos com pouca RAM não se qualificam para nenhum recurso de várias janelas.

A tabela a seguir lista as configurações em que um dispositivo pode ser configurado para modo janela para computador, dependendo do tamanho da tela e de como o dispositivo deve ser usado:

Modo Dispositivo portátil somente em tela cheia Dispositivo portátil em tela cheia projetando para uma tela conectada Tela grande em tela cheia que se estende até o display conectado Modo Janela para Computador: primeira tela grande
Exemplo de formato Smartphone Smartphone compatível com HDMI para tela externa Tablet compatível com HDMI para tela externa Tablet com teclado que oferece suporte a HDMI para tela externa
Experiência de tela interna Tela cheia, tela dividida, PiP, formato livre não desktop Tela cheia, tela dividida e picture-in-picture Tela cheia, tela dividida, PIP com suporte a modo janela para computador em espaços de trabalho separados O modo janela para computador é o padrão (suporta mesas separadas). Os usuários podem entrar no modo janela para computador em tela cheia ou sensível ao toque usando mesas separadas.
Experiência de tela conectada Espelhamento apenas da tela interna Modo Janela para Computador apenas em telas conectadas O modo janela para computador amplia os espaços de trabalho e está disponível em telas internas O modo janela para computador amplia os espaços de trabalho e está disponível em telas internas
Configurações
config_supportsMultiWindow true true true true
config_freeformWindowManagement true true true true
config_isDesktopModeSupported false true true true
config_canInternalDisplayHostDesktops Ignorado false true true
config_enterDesktopByDefaultOnFreeformDisplay Ignorado false false true

config_isDesktopModeSupported

A flag de sobreposição de configuração config_isDesktopModeSupported é a flag de nível superior para ativar o modo janela para computador. Se não estiver ativada, todas as outras configurações serão ignoradas. Defina como true em config.xml:

<!-- Globally enable Desktop windowing logic -->
    <bool name="config_isDesktopModeSupported">true</bool>

Quando config_isDesktopModeSupported é true, o sistema trata automaticamente telas externas qualificadas (como as conectadas por DisplayPort ou HDMI) como candidatas ao modo janela para computador. A tela precisa ser considerada qualificada pelo gerenciador de janelas (pelo menos pública e confiável, consulte modo janela para computador). O sistema tenta iniciar tarefas no modo de forma livre nesses displays por padrão.

config_canInternalDisplayHostDesktops

A flag de sobreposição de configuração config_canInternalDisplayHostDesktops ativa o modo de janela para computador na tela interna do dispositivo. Defina como true em config.xml:

<!-- Allow the primary internal display to host desktop sessions -->
    <bool name="config_canInternalDisplayHostDesktops">true</bool>

O modo janela para computador funciona melhor em um dispositivo de tela grande, como um tablet, em comparação com um smartphone menor. Se não estiver ativado, o Modo Janela para Computador só será compatível com uma tela externa (supondo que o dispositivo seja compatível com HDMI).

config_enterDesktopByDefaultOnFreeformDisplay

A flag de sobreposição de configuração config_enterDesktopByDefaultOnFreeformDisplay define o modo de janela para computador como o padrão na tela interna do dispositivo. Se não estiver ativado, o modo tela cheia será o padrão, com as mesas coexistindo. Defina como true em config.xml:

<!-- Enable Desktop windowing as the default windowing mode on the internal display -->
    <bool name="config_enterDesktopByDefaultOnFreeformDisplay">true</bool>

Ativar limites de tarefas

Para configurar o número máximo de tarefas compatíveis com o modo janela para computador, defina a flag de sobreposição de configuração config_maxDesktopWindowingActiveTasks em config.xml como o número máximo de tarefas compatíveis. Para oferecer suporte a um número ilimitado de tarefas, defina o valor da flag como 0:

<!-- Maximum number of tasks supported in desktop windowing -->
      <integer name="config_maxDesktopWindowingActiveTasks">4</integer>

Ativar limites de espaço de trabalho

Para configurar o número máximo de espaços de trabalho virtuais compatíveis com o modo janela para computador, defina a flag de sobreposição de configuração config_maxDesktopWindowingDesks em config.xml como o número máximo de espaços de trabalho compatíveis. Para oferecer suporte a um número ilimitado de mesas, defina o valor da flag como 0:

<!-- Maximum number of virtual desks supported in desktop windowing -->
      <integer name="config_maxDesktopWindowingDesks">4</integer>

Tela dividida

A experiência padrão de várias janelas é o modo de tela dividida, em que a interface do sistema é dividida no meio do dispositivo no modo retrato ou paisagem. Os usuários podem redimensionar a janela arrastando a linha divisória de um lado para o outro ou de cima para baixo, dependendo da orientação do dispositivo.

Depois de ativar a tela dividida, os fabricantes de dispositivos podem ativar o modo livre ou picture-in-picture.

O Android 8.0 e versões mais recentes melhoram a tela dividida compactando a tela de início quando o usuário toca em Início. Para detalhes da implementação, consulte Interações de tela dividida.

Picture-in-picture

Depois de ativar o modo de várias janelas com a flag config_supportsMultiWindow, os fabricantes de dispositivos podem oferecer suporte ao picture-in-picture, que permite aos usuários assistir vídeos enquanto navegam em outras atividades. Embora esse recurso seja destinado a dispositivos Android TV, outros tipos de dispositivos podem ser compatíveis com ele.

Para oferecer suporte ao PiP, ative o recurso do sistema PackageManager#FEATURE_PICTURE_IN_PICTURE em /android/frameworks/base/core/java/android/content/pm/PackageManager.java.

Para mais detalhes sobre a implementação do PiP em dispositivos com Android 8.0 e versões mais recentes, consulte Picture-in-picture.

IU do sistema

Ofereça suporte a todas as interfaces do sistema padrão de acordo com Verificação no modo de várias janelas.

Apps

Para oferecer suporte ao modo de várias janelas em apps pré-carregados, consulte Ofereça suporte ao modo de várias janelas.

Validação

Para validar a implementação do modo de várias janelas, execute os testes relacionados do CTS e siga as instruções em Verificação no modo de várias janelas.

Versão do Android Teste do CTS
7.0 /platform/cts/hostsidetests/services/activitymanager/src/android/server/cts
8.0 /platform/cts/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts
9.0 /platform/cts/tests/framework/base/activitymanager/src/android/server/am
Android 10 e versões mais recentes /platform/cts/tests/framework/base/windowmanager/src/android/server/wm