blob: 77421820dde36794d6a10c9fb4a8edb297c45fc5 [file] [log] [blame]
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
<div id="qv-wrapper">
<div id="qv">
<h2>Neste documento</h2>
<ol>
<li><a href="#overview">Visão geral</a></li>
<li><a href="#lifecycle">Ciclo de vida do modo de várias janelas</a></li>
<li><a href="#configuring">Configuração do aplicativo para o modo
de várias janelas</a></li>
<li><a href="#running">Execução do aplicativo no modo de várias janelas</a></li>
<li><a href="#testing">Teste do suporte a várias janelas em seu aplicativo</a></li>
</ol>
<h2>Veja também</h2>
<ol>
<li><a class="external-link" href="https://github.com/googlesamples/android-MultiWindowPlayground">Playground aplicativo de exemplo
do modo de várias janelas</a></li>
<li><a class="external-link" href="https://medium.com/google-developers/5-tips-for-preparing-for-multi-window-in-android-n-7bed803dda64">Cinco dicas para preparar o modo de várias janelas no Android N</a></li>
</ol>
</div>
</div>
<p>
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 <em>tela dividida</em>. Em dispositivos de TV, os aplicativos podem
usar o modo de <em>imagem em imagem</em> para continuar a reprodução do vídeo enquanto os usuários
interagem com outro aplicativo.
</p>
<p>
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.
</p>
<h2 id="overview">Visão geral</h2>
<p>
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:
</p>
<ul>
<li>Os dispositivos portáteis que executam o Android N oferecem o
modo de tela dividida. Nesse modo, o sistema preenche a tela com dois aplicativos, exibindo-os
lado a lado ou um acima do outro. O usuário pode arrastar a linha divisória
que separa os dois para que um aplicativo fique maior e o outro menor.
</li>
<li>No Nexus Player executando Android N, os aplicativos podem entrar
no <a href="picture-in-picture.html">modo de imagem em imagem</a>, o que permite
que continuem a exibir conteúdo enquanto o usuário navega ou interage com
outros aplicativos.
</li>
<li>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.
</li>
</ul>
<img src="{@docRoot}preview/images/mw-splitscreen.png" alt="" width="650" srcset="{@docRoot}preview/images/mw-splitscreen.png 1x,
{@docRoot}preview/images/mw-splitscreen_2x.png 2x," id="img-split-screen" />
<p class="img-caption">
<strong>Figura 1.</strong> Dois aplicativos executando lado a lado em modo de tela dividida.
</p>
<p>
O usuário pode mudar para o modo de várias janelas das seguintes maneiras:
</p>
<ul>
<li>Se o usuário abrir a <a href="{@docRoot}guide/components/recents.html">tela
Overview</a> e pressionar longamente um
título de atividade, poderá arrastá-la para uma parte destacada da
tela para colocá-la no modo de várias janelas.
</li>
<li>Se o usuário pressionar longamente o botão Overview, o dispositivo colocará
a atividade atual no modo de várias janelas e abrirá a tela Overview para
permitir que o usuário escolha outra atividade para compartilhar a tela.
</li>
</ul>
<p>
Os usuários podem <a href="{@docRoot}guide/topics/ui/drag-drop.html">arrastar e
soltar</a> 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.)
</p>
<h2 id="lifecycle">Ciclo de vida do modo de várias janelas</h2>
<p>
O modo de várias janelas não altera o <a href="{@docRoot}training/basics/activity-lifecycle/index.html">ciclo de vida
da atividade</a>.
</p>
<p>
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 <em>superior</em>.
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.
</p>
<p class="note">
<strong>Observação:</strong> 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 <em>não</em> 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()}.
</p>
<p>
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 <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Processamento de alterações
no tempo de execução</a>. 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 <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Processamento de alterações
no tempo de execução</a>, 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.
</p>
<p>
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á <a href="{@docRoot}guide/topics/resources/runtime-changes.html">mudanças de tempo de execução</a>
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
<code>windowBackgroundFallback</code>.
</p>
<h2 id="configuring">Configuração do aplicativo para o modo de várias janelas</h2>
<p>
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
<code>android:resizeableActivity</code> definido como true, todas as atividades
na pilha de tarefas serão redimensionáveis.
</p>
<p class="note">
<strong>Observação:</strong> 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
<em>não</em> 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.
</p>
<h4 id="resizeableActivity">android:resizeableActivity</h4>
<p>
Defina esse atributo no nó <code>&lt;activity&gt;</code> ou
<code>&lt;application&gt;</code> em seu manifesto para ativar ou desativar a exibição em
várias telas:
</p>
<pre>
android:resizeableActivity=["true" | "false"]
</pre>
<p>
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.
</p>
<p>
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.
</p>
<h4 id="supportsPictureInPicture">android:supportsPictureInPicture</h4>
<p>
Defina esse atributo no nó <code>&lt;activity&gt;</code> ou no seu manifesto para
indicar se a atividade oferece suporte à exibição no modo de imagem em imagem. Esse
atributo será ignorado se <code>android:resizeableActivity</code> for falso.
</p>
<pre>
android:supportsPictureInPicture=["true" | "false"]
</pre>
<h3 id="layout">Atributos de layout</h3>
<p>
No Android N, o elemento de manifesto <code>&lt;layout&gt;</code>
oferece suporte a diversos atributos que afetam o comportamento da atividade no
modo de várias janelas:
</p>
<dl>
<dt>
<code>android:defaultWidth</code>
</dt>
<dd>
Largura padrão da atividade quando iniciada no modo de forma livre.
</dd>
<dt>
<code>android:defaultHeight</code>
</dt>
<dd>
Altura padrão da atividade quando iniciada no modo de forma livre.
</dd>
<dt>
<code>android:gravity</code>
</dt>
<dd>
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.
</dd>
<dt>
<code>android:minimalHeight</code>, <code>android:minimalWidth</code>
</dt>
<dd>
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.
</dd>
</dl>
<p>
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:
</p>
<pre>
&lt;activity android:name=".MyActivity"&gt;
&lt;layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minimalHeight="450dp"
android:minimalWidth="300dp" /&gt;
&lt;/activity&gt;
</pre>
<h2 id="running">Execução do aplicativo no modo de várias janelas</h2>
<p>
O Android N oferece nova funcionalidade para dar suporte a aplicativos que podem ser executados
no modo de várias janelas.
</p>
<h3 id="disabled-features">Recursos desativados no modo de várias janelas</h3>
<p>
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:
<ul>
<li>Algumas opções de personalização de <a href="{@docRoot}training/system-ui/index.html">IU do sistema</a>
são desativadas. Por exemplo, os aplicativos não podem ocultar a barra de status
se não estiverem executando no modo de tela cheia.
</li>
<li>O sistema ignora as alterações no atributo <code><a href=
"{@docRoot}guide/topics/manifest/activity-element.html#screen"
>android:screenOrientation</a></code>.
</li>
</ul>
<h3 id="change-notification">Notificações e consultas de mudança no modo de várias janelas</h3>
<p>
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
<a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referência
do N Preview SDK</a>.
</p>
<dl>
<dt>
<code>Activity.isInMultiWindowMode()</code>
</dt>
<dd>
Chame para descobrir se a atividade está no modo de várias janelas.
</dd>
<dt>
<code>Activity.isInPictureInPictureMode()</code>
</dt>
<dd>
Chame para descobrir se a atividade está no modo de imagem em imagem.
<p class="note">
<strong>Observação:</strong> o modo de imagem em imagem é um caso especial do
modo de várias janelas. Se <code>myActivity.isInPictureInPictureMode()</code>
retornar true, <code>myActivity.isInMultiWindowMode()</code> também
retornará true.
</p>
</dd>
<dt>
<code>Activity.onMultiWindowModeChanged()</code>
</dt>
<dd>
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.
</dd>
<dt>
<code>Activity.onPictureInPictureModeChanged()</code>
</dt>
<dd>
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.
</dd>
</dl>
<p>
Existem também versões de {@link android.app.Fragment} para cada um desses
métodos como, por exemplo, <code>Fragment.isInMultiWindowMode()</code>.
</p>
<h3 id="entering-pip">Entrar no modo de imagem em imagem</h3>
<p>
Para colocar uma atividade no modo de imagem em imagem, chame o novo método
<code>Activity.enterPictureInPictureMode()</code>. 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 <a href="picture-in-picture.html">imagem em imagem</a>.
</p>
<h3 id="launch">Iniciar novas atividades no modo de várias janelas</h3>
<p>
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
<code>Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT</code>. A passagem
desse sinalizador solicita o seguinte comportamento:
</p>
<ul>
<li>Se o dispositivo estiver no modo de tela dividida, o sistema tentará criar a
nova atividade ao lado da atividade que a iniciou para que as duas atividades
compartilhem a tela. Nem sempre o sistema conseguirá fazer isso, mas as
atividades ficarão adjacentes, se possível.
</li>
<li>Se o dispositivo não estiver no modo de tela dividida, esse sinalizador não terá efeito.
</li>
</ul>
<p>
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
<code>ActivityOptions.setLaunchBounds()</code>. Esse método não terá efeito se
o dispositivo não estiver no modo de várias janelas.
</p>
<p class="note">
<strong>Observação:</strong> 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.
</p>
<h3 id="dnd">Suporte a arrastar e soltar</h3>
<p>
Os usuários podem <a href="{@docRoot}guide/topics/ui/drag-drop.html">arrastar e
soltar</a> 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.
</p>
<p>
O N Preview SDK estende o pacote <a href="{@docRoot}reference/android/view/package-summary.html"><code>android.view</code></a>
para oferecer suporte ao recurso arrastar e soltar entre aplicativos. Para obter detalhes sobre os seguintes
métodos e classes, consulte a <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referência
do Preview SDK</a>.
</p>
<dl>
<dt>
<code>android.view.DropPermissions</code>
</dt>
<dd>
Objeto token responsável por especificar as permissões concedidas ao aplicativo
que recebe uma ação de soltar.
</dd>
<dt>
<code>View.startDragAndDrop()</code>
</dt>
<dd>
Novo alias de {@link android.view.View#startDrag View.startDrag()}. Para
ativar o recurso de arrastar e soltar entre atividades, passe o novo sinalizador
<code>View.DRAG_FLAG_GLOBAL</code>. Se você precisar conceder permissões de URI à
atividade de destino, passe os novos sinalizadores,
<code>View.DRAG_FLAG_GLOBAL_URI_READ</code> ou
<code>View.DRAG_FLAG_GLOBAL_URI_WRITE</code>, conforme o caso.
</dd>
<dt>
<code>View.cancelDragAndDrop()</code>
</dt>
<dd>
Cancela uma operação de arrastar em andamento. Somente pode ser chamado
pelo aplicativo que originou a operação de arrastar.
</dd>
<dt>
<code>View.updateDragShadow()</code>
</dt>
<dd>
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.
</dd>
<dt>
<code>Activity.requestDropPermissions()</code>
</dt>
<dd>
Solicita as permissões dos URIs de conteúdo passados com {@link
android.content.ClipData} contidos em {@link android.view.DragEvent}.
</dd>
</dl>
<h2 id="testing">Teste do suporte a várias janelas em seu aplicativo</h2>
<p>
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.
</p>
<h3 id="configuring">Configuração de um dispositivo de teste</h3>
<p>
Se você instalar o Android N em um dispositivo, o modo de tela dividida
será instalado automaticamente.
</p>
<h3 id="test-non-n">Se o aplicativo não foi compilado com o N Preview SDK</h3>
<p>
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.
</p>
<p>
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.
</p>
<p>
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.
</p>
<h3 id="test-mw">Se você oferecer suporte ao modo de várias janelas</h3>
<p>
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.
</p>
<ul>
<li>Inicie o aplicativo em modo de tela inteira e mude para o modo de várias janelas
pressionando longamente o botão Overview. Verifique se o aplicativo alterna corretamente.
</li>
<li>Inicie o aplicativo diretamente no modo de várias janelas e verifique se o aplicativo
é iniciado corretamente. Você pode iniciar um aplicativo no modo de várias telas pressionando o
botão Overview, pressionando longamente a barra de título do aplicativo e arrastando-o
para uma das áreas destacadas na tela.
</li>
<li>Redimensione o aplicativo no modo de tela dividida, arrastando a linha divisora.
Verifique se o aplicativo é redimensionado sem falhar e se os elementos de IU necessários
estão visíveis.
</li>
<li>Se você especificou dimensões mínimas para o aplicativo, tente redimensionar
o aplicativo abaixo dessas dimensões. Verifique se não é possível redimensionar o aplicativo
para um tamanho menor que o mínimo especificado.
</li>
<li>Em todos os testes, verifique se o desempenho do aplicativo é aceitável. Por
exemplo, verifique se há uma demora muito grande para atualizar a IU após o
redimensionamento do aplicativo.
</li>
</ul>
<h4 id="test-checklist">Lista de verificação de teste</h4>
<p>
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.
</p>
<ul>
<li>Entre e saia do modo de várias janelas.
</li>
<li>Alterne do seu aplicativo para outro e verifique se o seu aplicativo se comporta
corretamente enquanto visível, mas não ativo. Por exemplo, se o seu aplicativo estiver
reproduzindo vídeo, verifique se a reprodução não é interrompida quando o usuário
interage com outro aplicativo.
</li>
<li>No modo de tela dividida, tente mover a barra divisora para aumentar e reduzir
o tamanho do aplicativo. Tente essas operações nas configurações lado a lado
e um acima do outro. Verifique se o aplicativo não falha,
se a funcionalidade essencial fica visível e se a operação de redimensionamento não demora
demais.
</li>
<li>Execute várias operações de redimensionamento em rápida sucessão. Verifique se o
aplicativo não falha nem apresenta vazamento de memória. Para obter informações sobre como verificar o uso de memória
do aplicativo, consulte <a href="{@docRoot}tools/debugging/debugging-memory.html">
Investigação do uso de RAM</a>.
</li>
<li>Use o aplicativo normalmente em diversas configurações diferentes de janela e
verifique se o aplicativo se comporta corretamente. Verifique se o texto é legível e se os
elementos de IU não ficam pequenos demais para a interação.
</li>
</ul>
<h3 id="test-disabled-mw">Se você desativou o suporte a várias janelas</h3>
<p>
Se você desativou o suporte a várias janelas definindo
<code>android:resizableActivity="false"</code>, 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.
</p>