Suporte a várias janelas

O Android 7.0 é compatível com a exibição de mais de um app ao mesmo tempo. Em dispositivos portáteis, dois apps podem ser executados lado a lado ou um acima do outro no modo de tela dividida. Em dispositivos de TV, os apps podem usar o modo picture-in-picture para continuar a reprodução de um vídeo enquanto os usuários interagem com outro app.

Caso seu app segmente o Android 7.0 (API de nível 24) ou versão mais recente, é possível configurar como ele lidará com a exibição em várias janelas. Por exemplo, você pode especificar as dimensões mínimas permitidas para a atividade. Você também pode desativar a exibição em várias janelas para o app, garantindo que o sistema o exiba somente em modo de tela cheia.

Geral

O Android permite que diversos apps compartilhem a tela ao mesmo tempo. Por exemplo, um usuário pode dividir a tela para visualizar uma página da Web no lado esquerdo e escrever um e-mail no lado direito. A experiência do usuário depende da versão do SO do Android e do tipo de dispositivo:

  • Os dispositivos portáteis com o Android 7.0 oferecem o modo de tela dividida. Nesse modo, o sistema preenche a tela com dois apps, exibindo um ao lado ou acima do outro. O usuário pode arrastar a linha divisória que separa os dois para que um app fique maior, e o outro, menor.
  • A partir do Android 8.0, os apps podem ser exibidos no modo picture-in-picture, o que permite que continuem mostrando conteúdo enquanto o usuário navega ou interage com outros apps.
  • Fabricantes de dispositivos maiores podem optar pelo modo de forma livre, em que o usuário pode redimensionar livremente cada atividade. Se o fabricante ativar esse recurso, o dispositivo oferecerá o modo de forma livre e o modo de tela dividida.

Figura 1. Dois apps executados lado a lado em modo de tela dividida.

O usuário pode mudar para o modo de várias janelas das seguintes maneiras:

  • Se o usuário abrir a tela "Visão Geral", tocar em um título de atividade e o mantiver pressionado, poderá arrastar a atividade para uma parte destacada da tela para colocá-la no modo de várias janelas.
  • Se o usuário tocar no botão "Visão geral" e o mantiver pressionado, o dispositivo colocará a atividade atual no modo de várias janelas e abrirá a tela "Visão geral" para que o usuário escolha outra atividade para compartilhar a tela.

Os usuários podem arrastar e soltar dados de uma atividade para outra enquanto as atividades compartilham a tela.

Ciclo de vida do modo de várias janelas

O modo de várias janelas não altera o ciclo de vida da atividade.

Nesse modo, somente a atividade com que o usuário interagiu mais recentemente fica ativa em um determinado momento. Essa atividade é considerada a atividade mais importante e é a única no estado RESUMED. Todas as outras atividades visíveis ficam no estado STARTED, mas não em RESUMED. No entanto, o sistema atribui a essas atividades pausadas, mas visíveis, uma prioridade maior que a das atividades não visíveis. Se o usuário interagir com uma das atividades visíveis, ela será retomada, e a atividade que antes era a mais importante entrará no estado STARTED.

Observação: no modo de várias janelas, um app pode não estar no estado RESUMED, mesmo que esteja visível para o usuário. Pode ser que um app precise continuar a operação, mesmo que não seja considerado a atividade principal. Por exemplo, um app de player vídeo e que está nesse estado continuará a exibir o vídeo. Por esse motivo, recomendamos que atividades que reproduzem vídeo não pausem a reprodução em resposta ao evento de ciclo de vida ON_PAUSE. Em vez disso, a atividade precisa começar a reprodução em resposta a ON_START e pausá-la em resposta a ON_STOP. Caso você processe eventos de ciclo de vida diretamente, em vez de usar o pacote Lifecycle, pause a reprodução do vídeo no seu gerenciador onStop() e retome a reprodução em onStart().

Quando o usuário coloca um app no modo de várias janelas, o sistema notifica a atividade sobre uma mudança na configuração, como especificado em Como processar alterações na configuração. Isso também acontece quando o usuário redimensiona o app ou o coloca novamente no modo de tela cheia. Essencialmente, essa mudança afeta o ciclo de vida da atividade igual da mesma forma que ocorre quando o sistema notifica o app sobre a mudança do modo retrato para paisagem no dispositivo, exceto que as dimensões do dispositivo são alteradas, em vez de simplesmente trocadas. Conforme discutido em Gerenciar alterações de configuração, a atividade pode processar a mudança de configuração por conta própria ou permitir que o sistema destrua a atividade e a recrie com as 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 sistema preencherá temporariamente essas áreas com a cor especificada pelo atributo windowBackground ou pelo atributo padrão de estilo windowBackgroundFallback.

Quando o app está no modo de várias janelas, o estado retomado depende da versão do Android do dispositivo.

  • No Android 9 (API de nível 28) e versões anteriores, somente a atividade com foco está no estado RESUMED todos os outros são PAUSED. Quando há várias atividades em um único processo de app, a atividade com a ordem Z mais alta é RESUMED (retomada) e as outras são PAUSED (pausadas).
  • No Android 10 (API de nível 29) e versões mais recentes, todas as atividades visíveis e com foco principal são RESUMED (retomadas).

Documentação de retomada múltipla para mais informações.

Várias janelas

Um dos benefícios de telas grandes é poder exibir várias janelas. No passado, ter dois apps lado a lado era comum em alguns dispositivos. A tecnologia melhorou tanto que agora três ou mais apps podem ser exibidos na tela ao mesmo tempo e também podem compartilhar conteúdo entre eles:

Se um app não for totalmente compatível com o recurso de várias janelas, ele poderá definir resizeableActivity=false. Para mais informações, leia o Guia de várias janelas.

Como o recurso de várias janelas está cada vez mais comum, é recomendável oferecer compatibilidade com o recurso arrastar e soltar no seu app.

Retomada múltipla

Quando executado no Android 9.0 e versões anteriores, somente o app em foco fica no estado retomado. Todas as outras atividades visíveis ficam pausadas. Isso poderá criar problemas se apps fecharem recursos ou pararem de reproduzir conteúdo quando pausados.

No Android 10, esse comportamento mudou para que todas as atividades permaneçam no estado retomado quando o dispositivo estiver no modo de várias janelas. Isso é chamado de retomadas múltiplas. Uma atividade pode ser pausada se houver uma atividade transparente sobre ela ou se a atividade não puder ser focalizada (por exemplo, no modo picture-in-picture ). Também é possível que nenhuma atividade esteja em foco em determinado momento, por exemplo, se a gaveta de notificações estiver aberta. OnStop continua funcionando normalmente. Ele será chamado sempre que a atividade for retirada da tela.

O recurso de retomada múltipla também está disponível em alguns dispositivos com Android 9.0. Para ativar a retomada múltipla nesses dispositivos, é possível adicionar os seguintes metadados do manifesto:

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

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

Acesso exclusivo a recursos

Para ajudar a oferecer suporte ao recurso de retomadas múltiplas, use o novo callback do ciclo de vida, Activity#onTopResumedActivityChanged().

Esse método é invocado quando uma atividade ganha ou perde a posição de principal atividade retomada. Isso é importante para saber quando uma atividade usa um recurso compartilhado de usuário único, 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 vários outros motivos, como a remoção de um pedaço de hardware compartilhado.

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

Para aplicativos que usam uma câmera, é recomendável usar o método CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged(), indicando que talvez seja um bom momento para tentar acessar a câmera. Esse método está disponível no Android 10 (API de nível 29) e em versões mais recentes.

Lembre-se de que resizeableActivity=false não garante o acesso exclusivo à câmera, já que outros aplicativos que usam a câmera podem ser abertos em outras telas.

Câmera no modo de várias janelas.

Seu app não precisa liberar a câmera quando perder o foco. Por exemplo, é possível continuar com a visualização da câmera enquanto o usuário interage com o app de retomada superior recém-focado. O aplicativo poderá continuar executando a câmera quando não for o de retomada superior, mas precisará gerenciar o caso de desconexão corretamente. Quando o app de retomada superior quiser usar a câmera, ele poderá abri-la, e seu app perderá o acesso. Seu app poderá reabrir a câmera quando for colocado em foco novamente.

Depois que um aplicativo receber uma chamada de retorno CameraDevice.StateCallback#onDisconnected(), chamadas subsequentes na câmera do dispositivo acionarão CameraAccessException.

Várias telas

No futuro, poderão existir smartphones dobráveis compatíveis com mais de uma tela por vez. O processamento dessa configuração é semelhante ao modo como os desenvolvedores trabalham atualmente com as telas projetadas no Chrome OS.

O Android 10 (API de nível 29) e versões mais recentes são compatíveis com atividades em telas secundárias. Se uma atividade estiver sendo executada em um dispositivo com várias telas, os usuários podem mover a atividade de uma tela para outra. A retomada múltipla também se aplica a situações com várias telas. Várias atividades podem receber entrada do usuário 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. Veja ActivityOptions para mais detalhes.

Como nas transições de dispositivos dobráveis, quando uma atividade passa para uma tela secundária, ela pode passar por uma atualização de contexto, redimensionamento de janela e alterações de configuração e recursos. Se a atividade gerenciar a alteração na configuração, isso será notificado em onConfigurationChanged(). Caso contrário, ela será reiniciada.

Uma atividade deve verificar a tela atual em onCreate e onConfigurationChanged, se gerenciada. 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, lembre-se de que a inicialização em uma tela secundária pode criar uma nova instância da atividade. As duas atividades serão retomadas ao mesmo tempo.

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

Para saber mais, leia sobre as APIs de várias telas que foram introduzidas no Android 8.0.

Corte da tela

Dispositivos dobráveis podem ter diferentes geometrias de corte quando dobrados e desdobrados. Para evitar problemas de corte, leia Práticas recomendadas para corte da tela.

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 é exibido. Isso permite que você receba as informações corretas sobre as métricas de densidade ou janela que o app tem no momento. É preciso usar sempre o contexto da atividade ou outro contexto baseado na IU para acessar informações sobre a janela ou tela atual. Isso também afeta algumas APIs do sistema que usam informações do contexto, como a Toast.

A configuração da janela da atividade e da tela principal definem os recursos e o contexto. Para ver a tela atual, use:

val activityDisplay = activity.display

Para ver as métricas da janela de atividade atual, use:

val windowMetrics = activity.windowManager.getCurrentWindowMetrics()

Para ver o máximo de métricas da janela para a configuração atual do sistema, use:

val maximumWindowMetrics = activity.windowManager.getMaximumWindowMetrics()

As métricas de janela máximas são ótimas informações para fazer cálculos, opções 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. Elas não podem ser usadas para dispor elementos de layout específicos e, em vez disso, precisam usar informações do objeto Configuration.

Usar telas secundárias

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

val dm = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val displays = dm.displays

Use a classe Display para acessar informações sobre uma tela específica, como ao conferir as sinalizações para ver se uma tela é segura.

No entanto, não presuma que o tamanho da tela em que o aplicativo será exibido será constante. Lembre-se de que, no modo de várias janelas, o aplicativo estará em um subconjunto da tela.

Para determinar se uma atividade pode ser iniciada em uma tela:

activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent)

E para iniciar uma atividade em uma tela:

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

Suporte a várias telas

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

Teclado de software

Um teclado pode ser mostrado em uma tela secundária se a exibição estiver configurada como compatível com decorações do sistema. O editor de método de entrada será exibido automaticamente se um campo de texto solicitar entrada nessa tela.

Teclado em uma tela secundária.

Plano de fundo

No Android 10 (API de nível 29) e mais recentes, as telas secundárias podem ter um plano de fundo. A biblioteca cria uma instância separada de WallpaperService.Engine para cada tela. Certifique-se de que a superfície de cada mecanismo seja desenhada de forma independente. Os desenvolvedores podem carregar recursos usando o contexto da tela em WallpaperService.Engine#getDisplayContext(). Além disso, verifique se o arquivo WallpaperInfo.xml é definido como android:supportsMultipleDisplays="true".

Planos de fundo na tela do smartphone e na secundária.

Telas de início

Há uma nova categoria de filtro de intent, SECONDARY_HOME, para fornecer uma atividade específica 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 nem singleTask.

Como exemplo, a implementação do AOSP de Launcher3 é compatível com uma atividade SECONDARY_HOME.

Tela de início com Material Design no smartphone.

Tela de início do Material Design em uma tela secundária.

Como configurar seu app para o modo de várias janelas

Se o app for direcionado à API de nível 24 ou mais recente, você pode configurar como e se as atividades dele são compatíveis com a exibição em várias janelas. Você pode definir atributos no manifesto para controlar o tamanho e o layout. As configurações de atributos de uma atividade raiz se aplicam a todas as atividades na pilha de tarefas. Por exemplo, se a atividade raiz tiver android:resizeableActivity definido como “verdadeiro”, todas as atividades na pilha de tarefas serão redimensionáveis.

Observação: se você criar um app com várias orientações que segmenta a API de nível 23 ou anterior, e o usuário usá-lo no modo de várias janelas, o sistema forçará o redimensionamento do app. O sistema exibe uma caixa de diálogo avisando o usuário de que o app pode se comportar de forma inesperada. O sistema não redimensiona apps de orientação fixa. Se o usuário tentar abrir um app desse tipo no modo de várias janelas, ele ocupará toda a tela.

Em alguns dispositivos maiores, como os Chromebooks, seu app pode ser executado em uma janela redimensionável, mesmo se você especificar android:resizeableActivity=”false”. Se isso corromper seu app, é possível usar filtros para restringir a disponibilidade do seu app nesses dispositivos.

android:resizeableActivity

Defina esse atributo no elemento <activity> ou <application> do manifesto para ativar ou desativar a exibição em várias janelas:

android:resizeableActivity=["true" | "false"]

Se esse atributo for definido como “verdadeiro”, a atividade poderá ser inicializada nos modos de tela dividida e forma livre. Se o atributo for definido como “falso”, a atividade não será compatível com o modo de várias janelas. Se o valor for "falso", e o usuário tentar iniciar a atividade no modo de várias janelas, a atividade usará o modo de tela cheia.

Se o app for destinado ao nível 24 da API, mas o valor desse atributo não for especificado, o atributo assumirá o valor padrão "true" (verdadeiro).

android:supportsPictureInPicture

Defina esse atributo no nó <activity> do manifesto para indicar se a atividade é compatível com a exibição no modo picture-in-picture. Esse atributo será ignorado se android:resizeableActivity for “falso”.

android:supportsPictureInPicture=["true" | "false"]

Atributos de layout

No Android 7.0, o elemento de manifesto <layout> é compatível com diversos atributos que afetam o comportamento da atividade no modo de várias janelas:

android:defaultWidth
Largura padrão da atividade quando iniciada no modo de forma livre.
android:defaultHeight
Altura padrão da atividade quando iniciada no modo de forma livre.
android:gravity
Posicionamento inicial da atividade quando iniciada no modo de forma livre. Consulte a referência de Gravity para verificar os valores adequados.
android:minHeight, android:minWidth
Indicam a altura e largura mínimas para a atividade nos modos de tela dividida e forma livre. Se o usuário mover o divisor no modo de tela dividida para tornar uma atividade menor que o mínimo especificado, o sistema recortará a atividade para o tamanho solicitado pelo usuário.

Por exemplo, o código a seguir mostra como especificar um tamanho e um local padrão para a atividade e também o tamanho mínimo, quando a atividade for exibida no modo de forma livre.

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

Processar mudanças de configuração corretamente

Se você estiver processando mudanças de configuração de várias janelas, por exemplo, o que acontece quando um usuário redimensiona uma janela, adicione o atributo android:configChanges ao seu manifesto com pelo menos os seguintes valores:

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

Após a adição de android:configChanges, sua atividade e seus fragmentos recebem um callback para onConfigurationChanged() em vez de serem destruídos e recriados. É possível, então, atualizar manualmente suas visualizações, recarregar recursos e executar outras operações, conforme o necessário.

Como executar seu app no modo de várias janelas

A partir do Android 7.0, o sistema oferece funcionalidade de compatibilidade com apps que podem ser executados no modo de várias janelas.

Recursos desativados no modo de várias janelas

Alguns recursos são desativados ou ignorados quando um dispositivo está no modo de várias janelas, porque não fazem sentido para uma atividade que pode estar compartilhando a tela do dispositivo com outras atividades ou apps. Esses recursos incluem o seguinte:

  • Algumas opções de personalização de IU do sistema são desativadas. Por exemplo, os apps não poderão ocultar a barra de status se não estiverem sendo executados no modo de tela cheia.
  • O sistema ignora as mudanças no atributo android:screenOrientation.

Notificações e consultas de mudança no modo de várias janelas

Activity oferece os métodos a seguir para compatibilidade com exibição em várias janelas.

isInMultiWindowMode()
Chame para descobrir se a atividade está no modo de várias janelas.
isInPictureInPictureMode()
Chame para descobrir se a atividade está no modo picture-in-picture.

Observação: o modo picture-in-picture é um caso especial do modo de várias janelas. Se myActivity.isInPictureInPictureMode() retornar “verdadeiro”, myActivity.isInMultiWindowMode() também retornará “verdadeiro”.

onMultiWindowModeChanged()
O sistema chama esse método sempre que a atividade entra ou sai do modo de várias janelas. O sistema transmitirá o valor “verdadeiro” ao método, se a atividade entrar no modo de várias janelas, e “falso”, se a atividade sair desse modo.
onPictureInPictureModeChanged()
O sistema chama esse método sempre que a atividade entra ou sai do modo picture-in-picture. O sistema transmitirá o valor “verdadeiro” ao método, se a atividade entrar no modo picture-in-picture, e “falso”, se a atividade sair desse modo.

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

Como entrar no modo picture-in-picture

Para colocar uma atividade no modo picture-in-picture, chame Activity.enterPictureInPictureMode(). Esse método não terá efeito se o dispositivo não for compatível com o modo picture-in-picture. Para ver mais informações, consulte a documentação do modo picture-in-picture.

Iniciar novas atividades no modo de várias janelas

Quando você inicia uma nova atividade, pode indicar que ela será exibida adjacente à atual, se possível. Para fazer isso, use a sinalização de intent FLAG_ACTIVITY_LAUNCH_ADJACENT. Essa sinalização diz ao sistema para tentar criar a nova atividade ao lado da atividade que a iniciou para que as duas atividades compartilhem a tela. O sistema faz o possível para fazer isso, mas não é garantido que isso aconteça.

Se um dispositivo estiver no modo de forma livre e você iniciar uma nova atividade, poderá especificar as dimensões e o local na tela da nova atividade chamando ActivityOptions.setLaunchBounds(). Esse método não terá efeito se o dispositivo não estiver no modo de várias janelas.

Observação: se você iniciar uma atividade em uma pilha de tarefas, essa atividade substituirá a atividade na tela, herdando todas as propriedades de várias janelas dela. Se você quiser iniciar a nova atividade como uma janela separada no modo de várias janelas, inicie-a em uma nova pilha de tarefas.

Compatibilidade com o recurso de arrastar e soltar

Os usuários podem arrastar e soltar dados de uma atividade para outra enquanto as duas atividades compartilharem a tela. Antes do Android 7.0, os usuários só podiam arrastar e soltar dados em uma única atividade. Para adicionar rapidamente compatibilidade com conteúdo que foi arrastado e solto em widgets TextView editáveis, consulte OnReceiveContentListener no Jetpack. Para oferecer compatibilidade abrangente com o recurso de arrastar e soltar, como ativar o recurso de arrastar do conteúdo do app, consulte o tópico arrastar e soltar.

DragAndDropPermissions
É o objeto token responsável por especificar as permissões concedidas ao app que recebe uma ação de soltar.
View.startDragAndDrop()
É o alias para View.startDrag(). Para ativar o recurso de arrastar e soltar entre atividades, transmita a sinalização DRAG_FLAG_GLOBAL. Se você precisar conceder permissões de URI à atividade de destino, transmita as sinalizações DRAG_FLAG_GLOBAL_URI_READ ou DRAG_FLAG_GLOBAL_URI_WRITE, conforme o caso.
View.cancelDragAndDrop()
Cancela uma operação de arrastar em andamento. Só pode ser chamado pelo app que originou a operação de arrastar.
View.updateDragShadow()
Substitui a ação de arrastar para uma operação de arrastar em andamento. Só pode ser chamado pelo app que originou a operação de arrastar.
Activity.requestDragAndDropPermissions()
Solicita as permissões dos URIs de conteúdo transmitidos com o ClipData contido em um DragEvent.
DragAndDropPermissions.release()
Libera as permissões necessárias para acessar os dados no URI de conteúdo fornecido no ClipData. Se você não chamar esse método, as permissões serão liberadas automaticamente quando a atividade contida for destruída.

Várias instâncias

Cada atividade raiz tem a própria tarefa, 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.

Não confunda várias instâncias com um layout de vários painéis, como um layout de lista/detalhes que usa SlidingPaneLayout. Isso é executado em 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 podem 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 em ambas as instâncias em uma tela menor.

Como testar a compatibilidade do seu app com o modo de várias janelas

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

Como configurar um dispositivo de teste

Se um dispositivo usar o Android 7.0 ou mais recente, ele será automaticamente compatível com o modo de tela dividida.

Caso seu app trabalhe com API de nível 23 ou anterior

Se o app for destinado ao nível 23 da API ou anterior, e o usuário tentar usá-lo no modo de várias janelas, o sistema forçará o redimensionamento dele, a menos que seja declarada uma orientação fixa.

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

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.

Se você oferecer suporte ao modo de várias janelas

Se o app for destinado ao nível 24 da API ou mais recente e não desativar a compatibilidade com várias janelas, verifique o comportamento a seguir nos modos de tela dividida e forma livre.

  • Mantenha o botão "Visão geral" pressionado para iniciar o app no modo de tela cheia e mudar para o modo de várias janelas. Verifique se o app alterna corretamente.
  • Inicie o app diretamente no modo de várias janelas e verifique se a inicialização ocorre corretamente. Você pode iniciar um app no modo de várias janelas pressionando o botão "Overview" e, em seguida, mantendo pressionada a barra de título do app e arrastando-o a uma das áreas destacadas na tela.
  • Redimensione o app no modo de tela dividida, arrastando a linha divisória. Verifique se o app é redimensionado sem falhar e se os elementos de IU necessários estão visíveis.
  • Se você especificou dimensões mínimas para o app, tente redimensioná-lo abaixo dessas dimensões. Verifique se não é possível redimensionar o app para um tamanho menor que o mínimo especificado.
  • Em todos os testes, verifique se o desempenho do app é aceitável. Por exemplo, verifique se há uma demora muito grande para atualizar a IU após o redimensionamento do app.

Lista de verificação de teste

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

  • Entre e saia do modo de várias janelas.
  • Alterne do seu app para outro e verifique se ele se comporta corretamente enquanto visível, mas não ativo. Por exemplo, se o app estiver reproduzindo vídeo, verifique se a reprodução não é interrompida quando o usuário interage com outro app.
  • No modo de tela dividida, tente mover a barra divisória para aumentar e reduzir o tamanho do app. Tente essas operações nas configurações lado a lado e um acima do outro. Verifique se o app não falha, se a funcionalidade essencial fica visível e se a operação de redimensionamento não demora demais.
  • Execute várias operações de redimensionamento em rápida sucessão. Verifique se o app não falha nem apresenta vazamentos de memória. Para ver informações sobre como verificar o uso da memória do app, use o Memory Profiler do Android Studio.
  • Use o app normalmente em configurações diferentes de janela e verifique se ele se comporta corretamente. Verifique se o texto é legível e se os elementos da IU não ficam pequenos demais para a interação.

Se você desativou a compatibilidade com o modo de várias janelas

Se você desativou a compatibilidade com várias janelas definindo android:resizeableActivity="false", inicie o app em um dispositivo com o Android 7.0 ou versão mais recente e tente colocá-lo nos modos de forma livre e tela dividida. Ao fazer isso, verifique se ele continua no modo de tela cheia.

Para ver mais informações sobre a compatibilidade com o modo de várias janelas no Android, consulte Cinco dicas para preparar o modo de várias janelas no Android N e o app de exemplo Playground de várias janelas (links em inglês).