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).
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
eminHeight
de uma atividade para determinar se a atividade pode ser executada no modo de várias janelas. SeresizeableActivity="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:
- Abra a tela Recentes
- Deslizar um app para vê-lo
- Pressionar o ícone do app na barra de título
- Selecionar a opção de menu "Tela dividida"
- 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:
Kotlin
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) } }
Java
public void openUrlInAdjacentWindow(String url) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK); 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:
Kotlin
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. } }
Java
@Override public void onTopResumedActivityChanged(boolean topResumed) { 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.
![](https://developer.android.com/static/develop/ui/compose/images/layouts/adaptive/multi-window-mode/camera.png?authuser=8&hl=pt)
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.
![](https://developer.android.com/static/develop/ui/compose/images/layouts/adaptive/multi-window-mode/multi-display.png?authuser=8&hl=pt)
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:
Kotlin
val activityDisplay = activity.getDisplay()
Java
Display activityDisplay = activity.getDisplay();
Veja as métricas atuais da janela de atividade:
Kotlin
val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()
Java
WindowMetrics windowMetrics = activity.getWindowManager().getCurrentWindowMetrics();
Encontre o máximo de métricas da janela para a configuração atual do sistema:
Kotlin
val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()
Java
WindowMetrics 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
:
Kotlin
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays = displayManager.getDisplays()
Java
DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE); Display[] 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:
Kotlin
val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent)
Java
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); boolean activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent);
Em seguida, inicie a atividade na tela:
Kotlin
val options = ActivityOptions.makeBasic() options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent, options.toBundle())
Java
ActivityOptions 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.
![](https://developer.android.com/static/develop/ui/compose/images/layouts/adaptive/multi-window-mode/keyboard.png?authuser=8&hl=pt)
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"
.
![](https://developer.android.com/static/develop/ui/compose/images/layouts/adaptive/multi-window-mode/wallpaper.png?authuser=8&hl=pt)
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
.
![](https://developer.android.com/static/develop/ui/compose/images/layouts/adaptive/multi-window-mode/launcher-phone.png?authuser=8&hl=pt)
![](https://developer.android.com/static/develop/ui/compose/images/layouts/adaptive/multi-window-mode/launcher-display.png?authuser=8&hl=pt)
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:
getCurrentWindowMetrics()
: retorna um objetoWindowMetrics
para o estado atual do janelamento do sistema.getMaximumWindowMetrics()
: retornaWindowMetrics
para o maior estado potencial de janelamento do sistema.
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
Kotlin
val windowMetrics = context.createDisplayContext(display) .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null) .getSystemService(WindowManager::class.java) .maximumWindowMetrics
Java
WindowMetrics windowMetrics = context.createDisplayContext(display) .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null) .getSystemService(WindowManager.class) .getMaximumWindowMetrics();
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 SeresizeableActivity="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 classeGravity
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:
- Amostra MultiWindowPlayground do Android
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