page.title=Suporte a várias janelas page.metaDescription=Novo suporte à exibição de mais de um aplicativo ao mesmo tempo no Android N. page.keywords="multi-window", "android N", "split screen", "free-form" @jd:body

Neste documento

  1. Visão geral
  2. Ciclo de vida do modo de várias janelas
  3. Configuração do aplicativo para o modo de várias janelas
  4. Execução do aplicativo no modo de várias janelas
  5. Teste do suporte a várias janelas em seu aplicativo

Veja também

  1. Playground — aplicativo de exemplo do modo de várias janelas
  2. Cinco dicas para preparar o modo de várias janelas no Android N

O Android N adiciona suporte à exibição de mais de um aplicativo ao mesmo tempo. Em dispositivos portáteis, dois aplicativos podem ser executados lado a lado ou um acima do outro no modo de tela dividida. Em dispositivos de TV, os aplicativos podem usar o modo de imagem em imagem para continuar a reprodução do vídeo enquanto os usuários interagem com outro aplicativo.

Se você compilar o aplicativo com o N Preview SDK, poderá configurar como o aplicativo processa a exibição de 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 de várias janelas para o aplicativo, garantindo que o sistema mostre o aplicativo apenas em modo de tela inteira.

Visão geral

O Android N permite que diversos aplicativos 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 compor um e-mail no lado direito. A experiência do usuário depende do dispositivo:

Figura 1. Dois aplicativos executando lado a lado em modo de tela dividida.

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

Os usuários podem arrastar e soltar dados de uma atividade para outra enquanto as atividades compartilham a tela. (Anteriormente, os usuários podiam apenas arrastar e soltar dados em uma única atividade.)

Ciclo de vida do modo de várias janelas

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

No modo de várias janelas, somente a atividade com a qual o usuário interagiu mais recentemente fica ativa em um determinado momento. Essa atividade é considerada a atividade superior. Todas as outras atividades ficam no estado pausado, mesmo se visíveis. 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 pausadas, ela será retomada e a atividade previamente superior será pausada.

Observação: em modo de suporte a várias janelas, um aplicativo pode estar no estado pausado e continuar visível ao usuário. Pode ser necessário que um aplicativo continue com suas atividades, mesmo se pausado. Por exemplo, um aplicativo que reproduz vídeo e que está no modo pausado, mas visível, deve continuar a exibir o vídeo. Por esse motivo, recomendamos que atividades que reproduzem vídeo não pausem o vídeo nos manipuladores {@link android.app.Activity#onPause onPause()}. Em vez disso, o vídeo deve ser pausado em {@link android.app.Activity#onStop onStop()} e a reprodução retomada em {@link android.app.Activity#onStart onStart()}.

Quando o usuário coloca um aplicativo no modo de várias janelas, o sistema notifica a atividade sobre a mudança de configuração, como especificado em Processamento de alterações no tempo de execução. Isso também acontece quando o usuário redimensiona o aplicativo ou coloca-o novamente no modo de tela cheia. Essencialmente, essa alteração afeta o ciclo de vida da atividade da mesma forma que quando o sistema notifica o aplicativo de que o dispositivo mudou do modo de retrato para paisagem, exceto que as dimensões do dispositivo são alteradas, em vez de simplesmente permutadas. Como discutido em Processamento de alterações no tempo de execução, a sua atividade pode processar ela mesma a mudança de configuração ou permitir que o sistema destrua a atividade e recrie-a 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 tempo de execução conforme necessário. Se o aplicativo demorar a desenhar nas áreas recém-expostas, o sistema preencherá temporariamente essas áreas com a cor especificada pelo atributo {@link android.R.attr#windowBackground windowBackground} ou pelo atributo de estilo padrão windowBackgroundFallback.

Configuração do aplicativo para o modo de várias janelas

Se o seu aplicativo for direcionado ao Android N, você poderá configurar como e se as atividades do aplicativo suportam 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 em sua pilha de tarefas. Por exemplo, se a atividade raiz tiver android:resizeableActivity definido como true, todas as atividades na pilha de tarefas serão redimensionáveis.

Observação: se você compilar um aplicativo com várias orientações usando uma versão do SDK anterior ao Android N e o usuário usar o aplicativo em modo de suporte a várias janelas, o sistema redimensionará forçosamente o aplicativo. O sistema apresenta uma caixa de diálogo avisando o usuário de que o aplicativo pode se comportar de forma inesperada. O sistema não redimensiona aplicativos de orientação fixa; se o usuário tentar abrir um aplicativo de orientação fixa no modo de várias janelas, o aplicativo ocupará toda a tela.

android:resizeableActivity

Defina esse atributo no nó <activity> ou <application> em seu manifesto para ativar ou desativar a exibição em várias telas:

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 oferecerá suporte ao modo de várias janelas. Se esse valor for falso e o usuário tentar iniciar a atividade no modo de várias janelas, a atividade ocupará a tela inteira.

Se o aplicativo for direcionado ao Android N, mas o valor desse atributo não for especificado, o atributo assumirá o valor padrão de verdadeiro.

android:supportsPictureInPicture

Defina esse atributo no nó <activity> ou no seu manifesto para indicar se a atividade oferece suporte à exibição no modo de imagem em imagem. Esse atributo será ignorado se android:resizeableActivity for falso.

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

Atributos de layout

No Android N, o elemento de manifesto <layout> oferece suporte a 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 {@link android.view.Gravity} para obter os valores adequados.
android:minimalHeight, android:minimalWidth
Altura mínima e largura mínima 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 uma localização padrão para a atividade, bem como o tamanho mínimo, quando a atividade é exibida no modo de forma livre:

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

Execução do aplicativo no modo de várias janelas

O Android N oferece nova funcionalidade para dar suporte a aplicativos 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, pois não fazem sentido para uma atividade que pode estar compartilhando a tela do dispositivo com outras atividades ou aplicativos. Esses recursos incluem:

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

Os novos métodos a seguir foram adicionados à classe {@link android.app.Activity} para oferecer suporte à exibição em várias janelas. Para obter detalhes sobre cada método, consulte a Referência do N Preview SDK.

Activity.isInMultiWindowMode()
Chame para descobrir se a atividade está no modo de várias janelas.
Activity.isInPictureInPictureMode()
Chame para descobrir se a atividade está no modo de imagem em imagem.

Observação: o modo de imagem em imagem é um caso especial do modo de várias janelas. Se myActivity.isInPictureInPictureMode() retornar true, myActivity.isInMultiWindowMode() também retornará true.

Activity.onMultiWindowModeChanged()
O sistema chama esse método sempre que a atividade entra ou sai do modo de várias janelas. O sistema passará ao método o valor true se a atividade entrar no modo de várias janelas e false se a atividade sair do modo de várias janelas.
Activity.onPictureInPictureModeChanged()
O sistema chama esse método sempre que a atividade entra ou sai do modo de imagem em imagem. O sistema passará ao método o valor true se a atividade entrar no modo de várias janelas e false se a atividade sair do modo de várias janelas.

Existem também versões de {@link android.app.Fragment} para cada um desses métodos como, por exemplo, Fragment.isInMultiWindowMode().

Entrar no modo de imagem em imagem

Para colocar uma atividade no modo de imagem em imagem, chame o novo método Activity.enterPictureInPictureMode(). Esse método não terá efeito se o dispositivo não oferecer suporte ao modo de imagem em imagem. Para obter mais informações, consulte a documentação do modo imagem em imagem.

Iniciar novas atividades no modo de várias janelas

Quando você iniciar uma nova atividade, poderá indicar ao sistema que a a nova atividade deverá ser exibida adjacente à atual, se possível. Para fazer isso, use o sinalizador Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT. A passagem desse sinalizador solicita o seguinte comportamento:

Se um dispositivo estiver no modo de forma livre e você iniciar uma nova atividade, poderá especificar as dimensões e a posição 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 suporte a várias janelas. Se você quiser iniciar a nova atividade como janela separada no modo de várias janelas, inicie essa atividade em uma nova pilha de tarefas.

Suporte a arrastar e soltar

Os usuários podem arrastar e soltar dados de uma atividade para outra enquanto as duas atividades compartilham a tela. (Anteriormente, os usuários podiam apenas arrastar e soltar dados em uma única atividade.) Por esse motivo, se o aplicativo não tem a funcionalidade de arrastar e soltar, pode ser uma boa ideia adicioná-la.

O N Preview SDK estende o pacote android.view para oferecer suporte ao recurso arrastar e soltar entre aplicativos. Para obter detalhes sobre os seguintes métodos e classes, consulte a Referência do Preview SDK.

android.view.DropPermissions
Objeto token responsável por especificar as permissões concedidas ao aplicativo que recebe uma ação de soltar.
View.startDragAndDrop()
Novo alias de {@link android.view.View#startDrag View.startDrag()}. Para ativar o recurso de arrastar e soltar entre atividades, passe o novo sinalizador View.DRAG_FLAG_GLOBAL. Se você precisar conceder permissões de URI à atividade de destino, passe os novos sinalizadores, View.DRAG_FLAG_GLOBAL_URI_READ ou View.DRAG_FLAG_GLOBAL_URI_WRITE, conforme o caso.
View.cancelDragAndDrop()
Cancela uma operação de arrastar em andamento. Somente pode ser chamado pelo aplicativo que originou a operação de arrastar.
View.updateDragShadow()
Substitui a sombra de arrastar para uma operação de arrastar em andamento. Somente pode ser chamado pelo aplicativo que originou a operação de arrastar.
Activity.requestDropPermissions()
Solicita as permissões dos URIs de conteúdo passados com {@link android.content.ClipData} contidos em {@link android.view.DragEvent}.

Teste do suporte a várias janelas em seu aplicativo

Atualizando ou não o seu aplicativo para o Android N, você deve verificar como ele se comporta no modo de várias janelas, pois um usuário pode tentar iniciá-lo no modo de várias janelas em um dispositivo executando o Android N.

Configuração de um dispositivo de teste

Se você instalar o Android N em um dispositivo, o modo de tela dividida será instalado automaticamente.

Se o aplicativo não foi compilado com o N Preview SDK

Se você não compilou o aplicativo com o N Preview SDK e o usuário tentar usar o aplicativo no modo de várias janelas, o sistema redimensionará obrigatoriamente o aplicativo, a menos que este declare uma orientação fixa.

Se o aplicativo não declarar uma orientação fixa, inicie o aplicativo em um dispositivo executando Android N e tente colocar o aplicativo no modo de tela dividida. Verifique se a experiência do usuário é aceitável quando o aplicativo é redimensionado obrigatoriamente.

Se o aplicativo declarar uma orientação fixa, você deverá tentar colocá-lo no modo de várias janelas. Verifique se, ao fazê-lo, o aplicativo continua no modo de tela cheia.

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

Se você compilar o aplicativo com o N Preview SDK e não tiver desativado o suporte a várias janelas, verifique o comportamento a seguir nos modos de tela dividida e forma livre.

Lista de verificação de teste

Para verificar o desempenho do aplicativo no modo de várias janelas, experimente as operações a seguir. Você deve tentar essas operações nos modos de tela dividida e várias telas, exceto onde houver instruções diferentes.

Se você desativou o suporte a várias janelas

Se você desativou o suporte a várias janelas definindo android:resizableActivity="false", inicie o aplicativo em um dispositivo executando Android N e tente colocá-lo nos modos de forma livre e tela dividida. Verifique se, ao fazê-lo, o aplicativo continua no modo de tela cheia.