Ofereça suporte ao modo de várias janelas

O modo de várias janelas permite que vários apps compartilhem a mesma tela simultaneamente. Os aplicativos podem ficar lado a lado ou um acima do outro (modo de tela dividida), um aplicativo uma pequena janela sobreposta a outros apps (modo picture-in-picture) ou em janelas móveis e redimensionáveis separadas (modo de formato livre).

Figura 1. Mostre dois apps lado a lado no modo de tela dividida.

A experiência do usuário depende da versão do Android e do tipo de dispositivo:

  • O Android 7.0 (API de nível 24) introduziu o modo de tela dividida em telas pequenas e o modo picture-in-picture em alguns deles.

    • O modo de tela dividida preenche a tela com dois apps, mostrando-os lado a lado ou um acima do outro. Os usuários podem arrastar o divisor separando os dois para deixar um maior e o outro menor.

    • O modo picture-in-picture permite que os usuários continuem a reprodução do vídeo. enquanto interage com outro app. Consulte Suporte ao modo picture-in-picture.

    • O modo de formato livre, em que os usuários podem redimensionar livremente cada atividade, pode por fabricantes de dispositivos de tela grande.

      Para configurar como seu app lida com o modo de várias janelas, especifique as dimensões mínimas permitidas para sua atividade. Também é possível desativar o modo de várias janelas para seu app definindo resizeabableActivity="false" para garantir que o sistema sempre mostre o app em tela cheia.

  • O Android 8.0 (nível 26 da API) estende o modo picture-in-picture para pequenas e dispositivos de tela.

  • O Android 12 (nível 31 da API) torna o modo de várias janelas o comportamento padrão.

    • Em telas grandes (classe de tamanho de janela média ou expandida), o plataforma oferece suporte a todos os apps no modo de várias janelas, independente do app configuração do Terraform. Se for resizeableActivity="false", o app será colocado em o modo de compatibilidade quando necessário para acomodar as dimensões de exibição.

    • Em telas pequenas (classe de tamanho de janela compacta), o sistema verifica os minWidth e minHeight de uma atividade para determinar se a atividade pode ser executada no modo de várias janelas. Se resizeableActivity="false", o app não poderá ser executado em o modo de várias janelas, independente da largura e altura mínimas.

    .

Modo de tela dividida

Para ativar o modo de tela dividida, os usuários podem fazer o seguinte:

  1. Abra a tela Recentes
  2. Deslizar um app para vê-lo
  3. Pressionar o ícone do app na barra de título
  4. Selecionar a opção de menu "Tela dividida"
  5. Selecione outro app na tela "Recentes" ou feche essa tela e executar outro app

Os usuários podem sair do modo de tela dividida arrastando o divisor de janelas até a borda da tela (para cima/baixo, esquerda/direita).

Iniciar adjacente

Caso seu app precise acessar conteúdo por uma intent, é possível usar FLAG_ACTIVITY_LAUNCH_ADJACENT para abrir o conteúdo em uma área adjacente janela de tela dividida.

A FLAG_ACTIVITY_LAUNCH_ADJACENT foi introduzida no Android 7.0 (nível 24 da API) para permita que os apps em execução no modo de tela dividida iniciem atividades no ambiente janela.

O Android 12L (nível 32 da API) e versões mais recentes ampliaram a definição da flag para permitir apps em tela cheia, ativar o modo de tela dividida e iniciar atividades na janela adjacente.

Para iniciar uma atividade adjacente, use FLAG_ACTIVITY_LAUNCH_ADJACENT no com FLAG_ACTIVITY_NEW_TASK, por exemplo:

fun openUrlInAdjacentWindow(url:
String) { Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url)
addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or Intent.FLAG_ACTIVITY_NEW_TASK)
 }.also { intent -> startActivity(intent) } }

Ciclo de vida da atividade no modo de várias janelas

O modo de várias janelas não muda o ciclo de vida da atividade. No entanto, o estado retomado de apps em várias janelas difere em diferentes versões do Android

Retomada múltipla

O Android 10 (nível 29 da API) e as versões mais recentes oferecem suporte à retomada múltipla. as atividades permanecem no estado RESUMED quando o dispositivo está no modo de várias janelas. modo Uma atividade pode ser pausada se houver uma atividade transparente sobre o atividade ou a atividade não é focalizável, por exemplo, a atividade está em modo picture-in-picture. Também é possível que nenhuma atividade tenha o foco em um determinado momento, por exemplo, se a gaveta de notificações estiver aberta. O onStop() funciona normalmente: o método é chamado sempre que uma atividade é retirada na tela.

O recurso de retomada múltipla também está disponível em alguns dispositivos com o Android 9 (nível da API) 28). Para ativar a retomada múltipla em dispositivos Android 9, adicione o seguinte manifesto metadados:

<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />

Para verificar se determinado dispositivo é compatível com esses metadados do manifesto, consulte as especificações do dispositivo.

Android 9

No modo de várias janelas no Android 9 (API de nível 28) e versões anteriores, somente a atividade com que o usuário interagiu mais recentemente fica ativa em determinado momento. Isso atividade é considerada a principal e é a única no RESUMED state. Todas as outras atividades visíveis ficam no estado STARTED, mas não em RESUMED. No entanto, o sistema dá a essas atividades visíveis, mas não retomadas, mais altas prioridade do que as atividades não visíveis. Se o usuário interagir com um dos atividades visíveis, a atividade é retomada e as atividades entra no estado STARTED.

Quando houver várias atividades em um único processo de app ativo, a atividade com a ordem z mais alta será retomada e as outras serão pausadas.

Mudanças de configuração

Quando o usuário coloca um app no modo de várias janelas, o sistema notifica o atividade de uma mudança de configuração, conforme especificado em Processar configurações mudanças. Isso também acontece quando o usuário redimensiona o app ou o recoloca de volta para o modo de tela cheia.

Essencialmente, essa mudança tem as mesmas implicações no ciclo de vida da atividade de quando o sistema notifica o aplicativo de que o dispositivo mudou do modo retrato para orientação paisagem, exceto que as dimensões do aplicativo são alteradas em vez de apenas sendo trocada. A atividade pode processar a mudança de configuração por conta própria. seu app pode permitir que o sistema destrua a atividade e a recrie com o novas dimensões.

Se o usuário redimensionar uma janela e aumentar uma de suas dimensões, o sistema redimensionará a atividade para corresponder à ação do usuário e emitirá mudanças de configuração conforme necessário. Se o app demorar a desenhar nas áreas recém-expostas, o o sistema preenche temporariamente essas áreas com a cor especificada pelo windowBackground ou pelo padrão windowBackgroundFallback.

Acesso exclusivo a recursos

Para ajudar na compatibilidade com o recurso de retomada múltipla, use o Callback do ciclo de vida de onTopResumedActivityChanged().

O callback é invocado quando uma atividade ganha ou perde a principal atividade retomada. posição, que é importante quando uma atividade usa um recurso de singleton compartilhado, como microfone ou câmera:

override fun
onTopResumedActivityChanged(topResumed: Boolean) { if (topResumed) { // Top
resumed activity. // Can be a signal to re-acquire exclusive resources. } else {
// No longer the top resumed activity. } }

Um app pode perder recursos por outros motivos, como a remoção de um hardware compartilhado.

Seja como for, é preciso que os apps tratem com eficiência os eventos e as mudanças de estado que afetam os recursos disponíveis.

Para apps que usam câmera, CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged() dá uma dica de que pode ser um bom momento para tentar acessar a câmera. Esse método está disponível a partir do Android 10 (API de nível 29).

O resizeableActivity=false não garante uma câmera exclusiva acesso, já que outros aplicativos que usam a câmera podem ser abertos em outras telas.

Figura 2. Câmera no modo de várias janelas.

O app não precisa liberar a câmera quando perder o foco. Por exemplo, você pode continuar a visualização da câmera enquanto o usuário interage. com o aplicativo de retomada superior recém-focado. É bom que o app guarde executar a câmera quando ele não é o principal app de retomada, mas precisa lidar com isso o caso de desconexão corretamente. Quando o aplicativo de retomada superior quiser usar o câmera poderá abri-lo, e seu app perderá o acesso. Seu app pode abrir novamente câmera quando o app volta o foco.

Depois que um app receber uma CameraDevice.StateCallback#onDisconnected() chamadas subsequentes na câmera vão gerar uma CameraAccessException.

Várias telas

O Android 10 (API de nível 29) é compatível com atividades em telas secundárias. Se uma atividade estiver sendo executada em um dispositivo com várias telas, os usuários poderão mover a atividade de uma tela para outra. A retomada múltipla se aplica a cenários multitelas também, Várias atividades podem receber entrada do usuário no ao mesmo tempo.

Um app pode especificar em qual tela precisa ser executado quando for iniciado ou quando criar outra atividade. Esse comportamento depende do modo de inicialização da atividade definido no arquivo de manifesto, bem como das sinalizações de intents e opções definidas pela entidade que está iniciando a atividade. Consulte a classe ActivityOptions para mais informações detalhes.

Quando uma atividade é movida para uma tela secundária, ela pode passar por uma atualização de contexto, redimensionamento de janela e mudanças de configuração e recursos. Se a atividade processa a mudança de configuração, a atividade é notificada em onConfigurationChanged() caso contrário, a atividade será reiniciada.

Uma atividade deve verificar a tela atual em onCreate() e onConfigurationChanged() se estiver processando a mudança de configuração. Certifique-se de atualizar os recursos e layouts quando a tela mudar.

Se o modo de inicialização selecionado para uma atividade permitir várias instâncias, iniciar em uma tela secundária pode criar uma nova instância da atividade. Ambas as atividades sejam retomados ao mesmo tempo.

Figura 3.Várias instâncias de uma atividade em várias telas.

Leia também sobre as APIs de várias telas que foram introduzidas no Android 8.0.

Atividade x contexto do app

Usar o contexto certo é fundamental quando se usa várias telas. Ao acessar recursos, o contexto da atividade (exibido) é diferente do contexto do app (que não é exibido).

O contexto da atividade contém informações sobre a tela e é sempre ajustado para a área da tela em que a atividade aparece. Isso permite que você obter as informações corretas sobre a densidade de exibição ou as métricas de janela do app. Sempre use o contexto da atividade (ou outro contexto baseado em UI contexto) para obter informações sobre a janela ou tela atual. Isso também afeta algumas APIs do sistema que usam informações do contexto (por exemplo, consulte Visão geral dos avisos).

A configuração da janela da atividade e da tela principal definem os recursos e o contexto. Veja a exibição atual da seguinte forma:

val activityDisplay = activity.getDisplay()

Veja as métricas atuais da janela de atividade:

val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()

Encontre o máximo de métricas da janela para a configuração atual do sistema:

val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()

As métricas de janela máximas são para fazer cálculos, escolhas de layout ou determinar o tamanho dos recursos a serem buscados antecipadamente. Se você as disponibilizar no método onCreate(), poderá tomar essas decisões antes da primeira transmissão do layout. Essas métricas não devem ser usadas para dispor elementos de visualização específicos. Em vez disso, use as informações do objeto Configuration.

Corte da tela

Dispositivos dobráveis podem ter diferentes geometrias de corte quando dobrados e desdobrados. Para evitar problemas de corte, consulte Suporte a cortes da tela.

Telas secundárias

Você pode acessar as telas disponíveis no serviço do sistema do DisplayManager:

val displayManager =
getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays =
displayManager.getDisplays()

Use a classe Display para consultar informações sobre uma tela específica, como como o tamanho de exibição ou sinalizações que indicam se uma tela é segura. No entanto, não presuma que o tamanho de exibição será o mesmo que o área de exibição alocada para o aplicativo. No modo de várias janelas, o aplicativo ocupar uma parte da tela.

Determine se uma atividade pode ser iniciada em uma tela:

val activityManager =
getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val
activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context,
displayId, intent)

Em seguida, inicie a atividade na tela:

val options = ActivityOptions.makeBasic()
options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent,
options.toBundle())

Suporte a várias telas

O Android é compatível com várias telas para teclados de software, planos de fundo e telas de início.

Teclado de software

Um teclado poderá ser mostrado em uma tela secundária se a exibição estiver configurada para oferecer suporte a decorações do sistema. O editor de método de entrada será exibido automaticamente se um campo de texto solicitar entrada nessa tela.

Figura 4. Teclado em uma tela secundária.

Plano de fundo

No Android 10 (API de nível 29), as telas secundárias podem ter um plano de fundo. O cria uma instância separada de WallpaperService.Engine para cada exibição. Verifique se a superfície de cada mecanismo é desenhada de maneira independente. Desenvolvedores carregar recursos usando o contexto de exibição WallpaperService.Engine#getDisplayContext(). Além disso, verifique se Os conjuntos de arquivos WallpaperInfo.xml são android:supportsMultipleDisplays="true".

Figura 5. Plano de fundo no smartphone e na tela secundária.

Telas de início

Uma nova categoria de filtro de intent, SECONDARY_HOME, fornece uma atividade dedicada para telas secundárias. Instâncias dessa atividade são usadas em todas as telas compatíveis com decorações do sistema, uma para cada tela.

<activity>
    ...
    <intent-filter>
        <category android:name="android.intent.category.SECONDARY_HOME" />
        ...
    </intent-filter>
</activity>

É necessário que a atividade tenha um modo de inicialização que não impeça várias instâncias e que possa se adaptar a diferentes tamanhos de tela. Não é possível usar os modos de inicialização singleInstance ou singleTask.

Por exemplo, a implementação do AOSP de Launcher3 oferece suporte a uma Atividade SECONDARY_HOME.

Figura 6. Tela de início com Material Design em um smartphone.
.
Figura 7. Tela de início com Material Design em uma tela secundária.

Métricas de janela

O Android 11 (nível 30 da API) introduziu os métodos WindowManager abaixo. para fornecer os limites de apps em execução no modo de várias janelas:

Os métodos da biblioteca WindowManager do Jetpack computeCurrentWindowMetrics(). e o computeMaximumWindowMetrics() oferecem recursos semelhantes respectivamente, mas com compatibilidade com versões anteriores para o nível 14 da API.

Para acessar métricas de outras telas além da atual, faça o seguinte: (conforme mostrado no snippet de código):

  • Crie um contexto de exibição
  • Crie um contexto de janela para a tela
  • Encontre o WindowManager do contexto da janela
  • Encontre o WindowMetrics da área de exibição máxima disponível para o app

val windowMetrics =
context.createDisplayContext(display)
.createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
.getSystemService(WindowManager::class.java) .maximumWindowMetrics

Métodos obsoletos

Os métodos Display getSize() e getMetrics() foram descontinuados em API de nível 30 em favor dos novos métodos WindowManager.

O Android 12 (nível 31 da API) descontinuou os métodos Display getRealSize() e getRealMetrics() e atualiza o comportamento para corresponder melhor ao comportamento de getMaximumWindowMetrics().

Configuração do modo de várias janelas

Caso seu app seja direcionado ao Android 7.0 (nível 24 da API) ou versões mais recentes, é possível configurar como e se as atividades do app oferecem suporte ao modo de várias janelas. Você pode definir atributos no manifesto para controlar o tamanho e o layout. O valor as configurações de atributos se aplicam a todas as atividades na pilha de tarefas. Por exemplo: se a atividade raiz tiver android:resizeableActivity="true", todas atividades da pilha de tarefas são redimensionáveis. Em alguns dispositivos maiores, como Chromebooks, o app poderá ser executado em uma janela redimensionável mesmo se você especificar android:resizeableActivity="false": Se isso corromper seu app, você poderá usar filtros no Google Play para restringir a disponibilidade do app nesses dispositivos.

O Android 12 (nível 31 da API) usa o modo de várias janelas por padrão. Em telas grandes (classe de tamanho de janela média ou expandida), todos os apps são executados no modo de várias janelas. independentemente da configuração do app. Em telas pequenas, o sistema verifica minWidth, minHeight e resizeableActivity da atividade para determinar se a atividade pode ser executada no modo de várias janelas.

resizeableActivity

Defina esse atributo no <activity> ou no <application> do manifesto. para ativar ou desativar o modo de várias janelas para o nível 30 da API e anteriores:

<application
  android:name=".MyActivity"
  android:resizeableActivity=["true" | "false"] />;

Se o atributo for definido como true, a atividade poderá ser iniciada na tela dividida e de formato livre. Se o atributo for definido como false, a atividade não será oferecer suporte ao modo de várias janelas. Se o valor for falso e o usuário tentar iniciar a atividade no modo de várias janelas, ela vai assumir o controle tela.

Se o app for direcionado ao nível 24 da API ou mais recente, mas você não especificar um valor para esse atributo, o valor do atributo assume o padrão de verdadeiro.

Se o app for direcionado ao nível 31 da API ou mais recente, esse atributo vai funcionar de forma diferente em para telas pequenas e grandes:

  • Telas grandes (classe de tamanho de janela média ou expandida): todos os apps oferecer suporte ao modo de várias janelas. O atributo indica se uma atividade pode ser redimensionados. Se for resizeableActivity="false", o app será colocado em o modo de compatibilidade quando necessário para atender às dimensões de exibição.
  • Telas pequenas (classe de tamanho de janela compacta): se resizeableActivity="true" e largura e altura mínimas da atividade estão dentro dos requisitos de várias janelas, a atividade oferece suporte a esse modo Se resizeableActivity="false", a atividade não oferece suporte o modo de várias janelas, independente da largura e altura mínimas da atividade.

supportsPictureInPicture

Defina esse atributo no nó <activity> do manifesto para indicar se a atividade oferece suporte ao modo picture-in-picture.

<activity
  android:name=".MyActivity"
  android:supportsPictureInPicture=["true" | "false"] />

configChanges

Para processar mudanças de configuração de várias janelas por conta própria, como quando um usuário redimensione uma janela, adicione o atributo android:configChanges ao app do manifesto <activity> com pelo menos os seguintes valores:

<activity
  android:name=".MyActivity"
  android:configChanges="screenSize | smallestScreenSize
      | screenLayout | orientation" />

Depois de adicionar android:configChanges, sua atividade e seus fragmentos recebem uma callback para onConfigurationChanged() em vez de ser destruído e recriadas. Depois disso, é possível atualizar manualmente suas visualizações, recarregar recursos e e realizar outras operações conforme necessário.

<layout>

No Android 7.0 (nível 24 da API) e versões mais recentes, o elemento de manifesto <layout> oferece suporte a vários atributos que afetam o comportamento da atividade no modo de várias janelas. modo:

  • android:defaultHeight, android:defaultWidth: altura e largura padrão de a atividade quando iniciada no modo de formato livre.

  • android:gravity: posicionamento inicial da atividade quando iniciada. modo de formato livre. Consulte a classe Gravity para conferir os valores adequados.

  • android:minHeight, android:minWidth: altura e largura mínimas para a atividade nos modos de tela dividida e formato livre. Se o usuário mudar o divisor no modo de tela dividida para tornar uma atividade menor que o o mínimo especificado, o sistema recorta a atividade para o tamanho que o usuário solicitações.

O código a seguir mostra como especificar um tamanho e um local padrão para a atividade, além do tamanho mínimo quando a atividade é exibida no modo de formato livre:

<activity android:name=".MyActivity">
    <layout android:defaultHeight="500dp"
          android:defaultWidth="600dp"
          android:gravity="top|end|..."
          android:minHeight="450dp"
          android:minWidth="300dp" />
</activity>

Modo de várias janelas no ambiente de execução

A partir do Android 7.0, o sistema oferece funcionalidade de suporte a aplicativos que pode ser executado no modo de várias janelas.

Recursos desativados no modo de várias janelas

No modo de várias janelas, o Android pode desativar ou ignorar recursos que não se aplicam a uma atividade que está compartilhando a tela do dispositivo com outros apps ou atividades.

Além disso, algumas opções de personalização da interface do sistema estão desativadas. Por exemplo: aplicativos não podem ocultar a barra de status se estiverem sendo executados no modo de várias janelas (consulte controlar a visibilidade da IU do sistema).

O sistema ignora as mudanças no atributo android:screenOrientation.

Callbacks e consultas no modo de várias janelas

A classe Activity oferece os seguintes métodos para compatibilidade com várias janelas modo:

  • isInMultiWindowMode(): indica se a atividade está em no modo de várias janelas.

  • isInPictureInPictureMode(): indica se a atividade está em no modo picture-in-picture.

  • onMultiWindowModeChanged(): o sistema chama esse método sempre que o a atividade entra ou sai do modo de várias janelas. O sistema passa o método um valor "true" se a atividade entra no modo de várias janelas, ou "false" se a atividade é sair do modo de várias janelas.

  • onPictureInPictureModeChanged(): o sistema chama esse método sempre que a atividade entra ou sai do modo picture-in-picture. O sistema passa ao método um valor “true” se a atividade entrar no modo picture-in-picture. ou false se a atividade sair do modo picture-in-picture.

A classe Fragment expõe versões de muitos desses métodos. por exemplo, Fragment.onMultiWindowModeChanged().

Modo picture-in-picture

Para colocar uma atividade no modo picture-in-picture, chame enterPictureInPictureMode() Esse método não terá efeito se o dispositivo não são compatíveis com o modo picture-in-picture. Para mais informações, consulte Adicionar vídeos usando picture-in-picture (PiP).

Novas atividades no modo de várias janelas

Ao iniciar uma nova atividade, você pode indicar que ela deve ser exibidas adjacente à atual, se possível. Usar a sinalização de intent FLAG_ACTIVITY_LAUNCH_ADJACENT, que instrui o sistema a tentar criar o nova atividade em uma janela adjacente para que as duas atividades compartilhem a tela. O sistema faz o possível para isso, mas não é garantido que isso aconteça.

Se um dispositivo estiver no modo de formato livre e você estiver iniciando uma nova atividade, será possível especifique as dimensões e a localização na tela da nova atividade chamando ActivityOptions.setLaunchBounds(). O método não terá efeito se o dispositivo não está no modo de várias janelas.

No nível 30 da API e anteriores, se você iniciar uma atividade em uma pilha de tarefas, o substitui a atividade na tela, herdando todos os valores de propriedades. Se você quiser iniciar a nova atividade como uma janela separada no no modo de várias janelas, inicie-o em uma nova pilha de tarefas.

O Android 12 (API de nível 31) permite que os apps dividam a janela de tarefas de um app entre várias atividades. Você determina como seu app mostra atividades (tela cheia, lado a lado ou empilhadas) criando um arquivo ou fazer chamadas da API WindowManager do Jetpack.

Arrastar e soltar

Os usuários podem arrastar e soltar dados de uma atividade para outra enquanto as duas atividades compartilham a tela. Antes do Android 7.0, os usuários só podiam arrastar e soltá-los em uma única atividade.) Para adicionar rapidamente o suporte para aceitação conteúdo removido, consulte a API DropHelper. Para recursos de arrastar e soltar abrangentes orientação, consulte Ativar o recurso de arrastar e soltar.

Várias instâncias

Cada atividade raiz tem uma tarefa própria, que é executada em um processo separado e exibida na própria janela. Para iniciar uma nova instância do seu app em uma janela separada, inicie novas atividades com a sinalização FLAG_ACTIVITY_NEW_TASK. Você pode combinar isso com alguns dos atributos de várias janelas para solicitar um local específico para a nova janela. Por exemplo, um aplicativo de compras pode exibir várias janelas para comparar produtos.

O Android 12 (nível 31 da API) permite iniciar duas instâncias de uma atividade lado a lado na mesma janela de tarefas.

Se você quiser permitir que os usuários iniciem outra instância do seu aplicativo o inicializador do aplicativo ou a barra de tarefas, verifique se a atividade do inicializador define android:resizeableActivity="true" e não usa um modo de inicialização que o que impede várias instâncias. Por exemplo, uma atividade singleInstancePerTask pode ser instanciadas várias vezes em tarefas diferentes quando FLAG_ACTIVITY_MULTIPLE_TASK ou FLAG_ACTIVITY_NEW_DOCUMENT está definido.

Não confunda várias instâncias com um layout de vários painéis, como um detalhes de lista apresentação que usa SlidingPaneLayout, executada dentro de uma única janela.

Quando várias instâncias estão em execução em janelas separadas em um dispositivo dobrável, uma ou mais instâncias poderão ser enviadas para o segundo plano se a posição mudar. Por exemplo, suponha que um dispositivo não esteja dobrado e tenha duas instâncias de app em execução em duas janelas em ambos os lados. Se o dispositivo estiver dobrado, uma das instâncias poderá ser encerrada em vez de tentar encaixar as janelas de ambas as instâncias em uma tela menor.

Verificação no modo de várias janelas

Mesmo que o app não seja direcionado ao nível 24 da API ou mais recente, é preciso verificar como ele se comporta no modo de várias janelas caso um usuário tente iniciá-lo no modo de várias janelas em um dispositivo com Android 7.0 ou mais recente.

Testar dispositivos

Dispositivos com o Android 7.0 (nível 24 da API) ou versões mais recentes oferecem suporte ao modo de várias janelas.

Nível 23 da API ou anterior

Quando os usuários tentam usar o app no modo de várias janelas, o sistema força o redimensionamento do app, a menos que ele declare uma orientação fixa.

Se o app não declarar uma orientação fixa, inicie-o em um dispositivo com Android 7.0 ou mais recente e tentar colocar o app em modo de tela dividida. Verifique se a experiência do usuário é aceitável quando o app é redimensionados à força.

Se o app declarar uma orientação fixa, tente colocá-lo no modo de várias janelas. Ao fazer isso, verifique se ele continua no modo de tela cheia.

APIs de nível 24 ao 30

Se o app for direcionado a APIs de nível 24 a 30 e não desativar a compatibilidade com várias janelas, verifique o seguinte comportamento nos modos de tela dividida e formato livre:

  • Inicie o app em tela cheia e mude para o modo de várias janelas ao manter o botão Recentes pressionado. Verifique se o app alterna corretamente.

  • Inicie o app diretamente no modo de várias janelas e verifique se ele é lançado corretamente. Você pode iniciar um aplicativo no modo de várias janelas pressionando o botão Recentes, tocar na barra de título e mantê-la pressionada e arrastando-o para uma das áreas destacadas na tela.

  • Para redimensionar o app no modo de tela dividida, arraste o divisor de tela. Verificar que o app seja redimensionado sem falhar e que os elementos de IU necessários sejam visíveis.

  • Se você especificou dimensões mínimas para seu aplicativo, tente redimensionar o para que o tamanho da janela seja menor do que essas dimensões. Verifique se não é possível redimensionar o app para um tamanho menor que o mínimo especificado dimensões.

  • Em todos os testes, verifique se o desempenho do app é aceitável. Para exemplo, verifique se não há um atraso muito longo para atualizar a interface depois que o é redimensionado.

API de nível 31 ou mais recente

Se o app for direcionado ao nível 31 da API ou mais recente e à largura mínima da atividade principal e altura mínima são menores ou iguais às respectivas dimensões do área de exibição disponível, verifique todos os comportamentos listados para API de nível 24 até 30.

Lista de verificação de teste

Para verificar o desempenho do app no modo de várias janelas, realize as operações a seguir. Tente executar estas operações nos modos de tela dividida e de formato livre, exceto quando houver instruções diferentes.

  • Entre e saia do modo de várias janelas.

  • Mudar do seu app para outro e verificar se ele se comporta corretamente enquanto está visível, mas não ativo. Por exemplo, se o seu app é reproduzindo vídeo, verifique se a reprodução continua enquanto o usuário está interagindo com outro app.

  • No modo de tela dividida, tente mover o divisor de tela para que o app fique cada vez maiores. Tente realizar essas operações em ambos lado a lado e um acima as outras configurações. Verificar se o app não falha (essencial) está visível e a operação de redimensionamento não demora demais.

  • Execute várias operações de redimensionamento em rápida sucessão. Verificar se o app não falhe nem vaze memória. O Memory Profiler do Android Studio oferece informações sobre o uso da memória do app. Consulte Inspecionar a memória do app uso com o Memory Profiler).

  • usar o app normalmente em várias configurações de janela diferentes; verificar se o app se comporta corretamente. Verifique se o texto está legível e se Os elementos da interface não são pequenos demais para a interação.

Suporte ao modo de várias janelas desativado

Nos níveis 24 a 30 da API, se você desativou o suporte a várias janelas definindo android:resizeableActivity="false", inicie o app em um dispositivo com as versões 7.0 a 11 do Android e tenta colocar o app em tela dividida. modos de formato livre. Verifique se, ao fazer isso, o app permanece em tela cheia. modo

Outros recursos

Para mais informações sobre a compatibilidade com várias janelas no Android, consulte:

Recomendado para você * Observação: o texto do link aparece quando o JavaScript está desativado. * Modo de compatibilidade do dispositivo * Suporte ao redimensionamento para telas grandes * Gerenciar mudanças de configuração