Modo de Janela de Freeform do Android Nougat: o que é e como os desenvolvedores podem usá-lo
Quando o
Android 7.0 Nougat foi anunciado pela primeira vez no início de 2016,
ele trouxe com ele um recurso muito solicitado para a plataforma Android
- suporte multi-janela. A maioria das pessoas
está ciente do suporte a multi-janelas com tela dividida ativado por
padrão em todos os celulares e tablets do Android Nougat. Os dispositivos Android TV com Android Nougat vêm com suporte para suporte de multi-janelas de imagem em imagem.
No
entanto, há um terceiro modo multi-janela presente no Android Nougat
que não muitas pessoas estão cientes de: modo de janela de forma livre. Este
modo permite ao Android apresentar aplicativos como janelas flutuantes
que podem ser movidas e redimensionadas à vontade pelo usuário. É essencialmente a implementação do Android de um gerenciador de janelas de empilhamento.
Na documentação do SDK do Android, afirma que:
Os fabricantes de dispositivos maiores podem optar por ativar o modo de forma livre, no qual o usuário pode redimensionar livremente cada atividade. Se o fabricante habilitar esse recurso, o dispositivo oferece modo de forma livre, além do modo de tela dividida.
Os fabricantes de dispositivos maiores podem optar por ativar o modo de forma livre, no qual o usuário pode redimensionar livremente cada atividade. Se o fabricante habilitar esse recurso, o dispositivo oferece modo de forma livre, além do modo de tela dividida.
E também, no Android 7.0 CDD:
Implementações de dispositivos com tamanho de tela xlarge DEVE apoiar o modo de forma livre.
Isso indica
que qualquer novo dispositivo Android de tela grande que acompanha o
Android 7.0 poderia ter o modo de janela livre habilitado pelo
fabricante.
No entanto, esta não é absolutamente uma exigência difícil. É possível forçar qualquer dispositivo Android Nougat (com as opções de desenvolvedor habilitado) para oferecer suporte ao modo de janela de forma livre usando um dos dois métodos diferentes:
No entanto, esta não é absolutamente uma exigência difícil. É possível forçar qualquer dispositivo Android Nougat (com as opções de desenvolvedor habilitado) para oferecer suporte ao modo de janela de forma livre usando um dos dois métodos diferentes:
Ativando o modo de janela de forma livre em qualquer dispositivo Android Nougat
Método 1 (um computador com adb é necessário)
Verifique se a Depuração USB está ativada nas Opções do desenvolvedor. Em seguida, conecte o dispositivo a um computador com o adb instalado e execute o seguinte comando:"adb shell settings put global enable_freeform_support 1"
Método 2 (sem requisitos adicionais)
Ative a opção "Forçar atividades a serem redimensionáveis" na parte inferior das Opções do desenvolvedor.
Ambos os métodos requerem a interface de utilizador do sistema para ser reiniciado antes que possam ter efeito. A maneira mais fácil de fazer isso é reiniciar o dispositivo (ou, se o
dispositivo estiver enraizado, você pode simplesmente matar o processo
com.android.systemui)
OK, então modo de forma livre está ativado ... agora o quê?
Se você ativou o modo de forma livre usando o Método 1, então haverá
um novo botão nas entradas do aplicativo no menu Visão geral para
iniciar um aplicativo no modo de janela de forma livre.
No Método 2, no entanto, não é possível lançar um aplicativo no modo de forma livre através do próprio Android. Felizmente, é possível que qualquer lançador de terceiros lance um
aplicativo no modo de janela de forma livre usando APIs padrão do
Android que foram finalizadas como parte do nível 24 da API.
A chave para o lançamento de um aplicativo no modo de forma livre é chamar o método ActivityOptions.setLaunchBounds (). Este método leva um Rect como um argumento, contendo os limites de janela que o aplicativo será lançado com.
Você pode então iniciar o aplicativo com startActivity (Intent, Bundle). Se você ainda não tiver um pacote ActivityOptions, crie um com
ActivityOptions.makeBasic () e, em seguida, chamando setLaunchBounds ()
no bundle recém-criado.
Observe
que, por padrão, se já houver uma tarefa para o aplicativo na tela
Visão geral, o Android simplesmente redirecionará para a tarefa
existente (tela cheia) que foi lançada anteriormente pelo usuário. Você
precisará limpar todas as tarefas do aplicativo na Visão Geral antes de
tentar iniciar o aplicativo em uma janela de formulário livre. (Para
aplicativos com atividades que são iniciadas nos modos padrão ou
singleTop, você pode forçar uma nova janela para abrir, adicionando o: Intent.FLAG_ACTIVITY_MULTIPLE_TASK sinalizador para a intenção antes de chamar startActivity ().)
Como funciona o modo freeform sob o capô?
Existe
um excelente artigo escrito que explica como o modo multi-janela,
incluindo o modo de forma livre, é implementado no Android Nougat. (NOTA: o artigo está escrito em chinês, por isso certifique-se de executá-lo através do Google Translate)
Em
poucas palavras, os aplicativos no modo freeform são executados em uma
pilha separada do resto do sistema (pense: desktop virtual). Portanto, não é possível que aplicativos de forma livre sejam
executados em cima do lançador ou em cima de outro aplicativo em tela
cheia.
As
aplicações em execução no modo de forma livre (que não têm o android:
windowIsFloating definido como verdadeiro) têm um DecorCaptionView
adicionado como uma criança do DecorView de nível superior. Essa exibição contém um LinearLayout definindo a barra de legenda da janela para mover, maximizar e fechar a janela. Embora eu não recomendá-lo pessoalmente, é possível acessar e
personalizar essa exibição, obtendo o DecorView usando
Window.getDecorView (), moldando-o para um ViewGroup e, em seguida,
acessando suas exibições filho.
Qualquer
aplicativo que seja projetado para se comportar bem no modo de
multi-janelas de tela dividida padrão do Android funcionará no modo de
forma livre. IsInMultiWindowMode () retornará true para aplicativos em execução no modo freeform. Existem
algumas outras classes disponíveis publicamente e métodos que um
aplicativo pode usar que se relacionam especificamente com o modo de
forma livre:Window.setDecorCaptionShade (): este método pode ser usado para substituir a sombra dos controles de legenda (o botão maximizar e fechar) para aplicativos no modo de forma livre.Window.setRestrictedCaptionAreaListener (): isso pode ser usado para detectar quando uma janela é movimentada no modo freeform. O Window.OnRectrictedCaptionAreaChangedListener é chamado sempre que a posição dos controles de legenda é alterada (quando um usuário move a janela ao redor) e fornece um Rect com os novos limites dos controles de legenda.ActivityInfo.WindowLayout: essa classe contém informações declaradas no manifesto do aplicativo como o posicionamento inicial de uma janela de formulário livre que um aplicativo pode solicitar no lançamento. Por exemplo, você pode listar o seguinte na tag <activity> do seu manifesto:
<layout
android:defaultHeight="640dp"
android:defaultWidth="360dp"
android:gravity="center" />
Em seguida, quando o dispositivo já está no modo de forma livre e o aplicativo é
iniciado, ele será iniciado com esses limites especificados.
Exemplos de modo de janela de forma livre em ação
No
verão de 2016, enquanto o Android Nougat ainda era uma visualização de
desenvolvedor, eu lancei um aplicativo chamado Taskbar que fornece um
menu de início do Windows e lista de aplicativos recentes em uma
sobreposição de sistema. Ele
permite que os usuários no Nougat para lançar aplicativos no modo de
janela de forma livre - e, uma vez que a barra de tarefas usa uma
sobreposição, ele pode permanecer na tela no ambiente de janela de forma
livre. A combinação de Taskbar e modo de forma livre dá qualquer dispositivo Android, especialmente comprimidos, um PC-como sentir.
Você pode fazer o download da Barra de Tarefas no Google Play ou visualizar o código fonte no GitHub. Além
dos conceitos mencionados neste artigo, eu também empregar alguns
truques para manter o ambiente de modo de forma livre ativo, mesmo
quando não freeform janelas são exibidas na tela. Os usuários também podem opcionalmente configurar a Barra de Tarefas
como seu iniciador padrão para permitir que seu dispositivo inicialize
automaticamente para o ambiente de modo de forma livre.
Como
não há dispositivos que oficialmente são fornecidos com o suporte de
janela de forma livre ativado pelo OEM (a partir desta redação), eu
recomendo usar a barra de tarefas como uma ferramenta para os
desenvolvedores testarem seus aplicativos no ambiente de janela de forma
livre em dispositivos que não o suportam .
Além
da barra de tarefas, também modifiquei o código fonte do Launcher3 do
AOSP para permitir que ele inicie aplicativos no modo freeform. Este
é um clone reto do Android 7.1.1 lançador de ações, com as mínimas
modificações necessárias necessárias para permitir que ele acionar
aplicativos de forma livre. Eu
forneci este lançador modificado na esperança de que outros
desenvolvedores irão implementar o suporte para o lançamento de janelas
freeform em seus lançadores personalizados. Você pode ver o código fonte no GitHub, ou fazer o download de um exemplo de APK.
Minha
esperança é que os desenvolvedores de lançadores personalizados possam
utilizar esse código e permitir suporte para o lançamento de aplicativos
de janela de forma livre para os usuários que desejam maior
flexibilidade para o gerenciamento de janelas em seus dispositivos de
grande tela. 

No comments: