O modo de lançamento do Android CheatSheet animado

20 de dezembro, 2018 – 6 min ler

>

Antes da API 11, usávamos atividades mostrar cada nova página na tela. Agora com Fragmentos e as ferramentas de navegação na API 28, é totalmente possível fazer uma aplicação muito complexa com apenas uma atividade. No entanto, as atividades ainda são ótimas para secionar sua aplicação em etapas e processos. Talvez você queira dividir todo o marketing em uma única atividade, e ter o aplicativo real em sua própria atividade. Talvez você queira uma seção reservada para uma característica, como um serviço de chat. Conhecer os modos de lançamento de atividade ajuda você a dividir melhor esses processos de forma que faça sentido para seus usuários. Sentado no trabalho, eu nunca consegui me lembrar dos modos de lançamento do topo da minha cabeça, então eu pensei em escrever um blog sobre isso, animar alguns gifs para ilustrar os conceitos, e depois compartilhá-lo com todos. Aproveite!

Antes de falar sobre os modos de lançamento, vamos primeiro entender o papel de uma tarefa. Uma tarefa contém uma coleção de atividades que são organizadas em uma pilha chamada backstack. A primeira atividade a ser lançada em uma tarefa é a atividade raiz. Pressionar o botão voltar em uma atividade raiz não só mata a atividade, mas também mata a tarefa, e possivelmente o app.

Agora vamos mergulhar em alguns modos de lançamento!

Vamos dizer que você tem uma tarefa com uma atividade raiz chamada A, e então lança uma nova atividade chamada B, B é empurrada para o topo da pilha. Agora vamos dizer que você lança outra atividade B a partir da B que acabamos de criar, você agora terá duas instâncias de atividade B empilhadas uma em cima da outra. Se um usuário pressionar o botão voltar, ele irá voltar para outra instância da Atividade B. Isto pode ser muito confuso para o usuário. O empilhamento e criação de atividades uma em cima da outra, não importa o quê, é chamado de modo de lançamento Standard. Se não houver um modo de lançamento definido na atividade XML no manifesto, a atividade usará o modo de lançamento padrão.

>

Agora que vemos como o modo Padrão pode ser jarrante para o usuário, podemos agora entender o modo de lançamento Single Top. Este modo de lançamento impede que diferentes instâncias das mesmas atividades sejam empilhadas umas sobre as outras. Digamos que a Activity B é um único topo. Podemos definir modos de lançamento no manifesto assim:

///AndroidManifest.xml
<application
...>
<activity android:name=".Activity_A">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <activity android:name=".Activity_B" android:launchMode="singleTop"/> <activity android:name=".Activity_C"/>
<activity android:name=".Activity_D"/>
</application>

Então agora se você lançar a Atividade B da Atividade B, ao invés de criar uma nova instância de B e empilhá-la em cima da antiga B, a intenção é passada para a instância atual de B. A única maneira de ter duas instâncias da mesma atividade em uma tarefa é lançar uma atividade diferente de B, e então criar B a partir dessa atividade. O conceito principal do modo de lançamento único de topo é que você não pode ter duas instâncias da mesma atividade empilhadas uma em cima da outra.

Se você não quiser 2 instâncias da mesma atividade única de topo em uma tarefa enquanto estiver usando o modo de lançamento único de topo, você pode passar a constante FLAG_ACTIVITY_CLEAR_TOP na sua intenção. Para ilustrar o que isto faz, digamos que sua pilha de atividades é ABC (B ainda é single top). Se você lançar B de C com FLAG_ACTIVITY_CLEAR_TOP, a sua pilha irá aparecer até B e a intenção será passada para aquela mesma instância de B.

// code example for passing the constant flag in your intentIntent intent = new Intent(this, Activity_B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

>

O próximo modo de lançamento chama-se Single Task. Neste modo de lançamento, afirmamos que uma atividade só pode pertencer a uma tarefa em todas as tarefas da aplicação. Tão semelhante ao comportamento FLAG_ACTIVITY_CLEAR_TOP, se a sua pilha for ABC, e você lançar B (uma única tarefa) a partir de C, vamos até B, e passamos a intenção para essa instância.

>

<activity android:name=".Activity_B" android:launchMode="singleTask"/>

>

>

>>

>

>

>

Mas e se quisermos que B esteja na sua própria tarefa? É aqui que a afinidade com a tarefa entra em jogo. A afinidade de tarefas permite definir a que tarefa uma atividade pertence. Por padrão, uma atividade tem a mesma afinidade de tarefa que sua atividade raiz. Com a afinidade de tarefas, podemos agora separar as actividades em diferentes tarefas.

<activity android:name=".Activity_A"
android:taskAffinity="com.affinity.of.a">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity><activity android:name=".Activity_B"
android:launchMode="singleTask"
android:taskAffinity="com.affinity.of.b"
/>

Aqui, Actividade A e Actividade B têm afinidades de tarefas diferentes. Quando A é criada na Tarefa 1, C é lançada de A. Por padrão, cada atividade tem a mesma afinidade que a sua raiz, então ainda estamos na Tarefa 1. Agora B é lançada a partir de C. B tem uma afinidade de tarefa diferente, então agora é a raiz da Tarefa 2, que então se move para o primeiro plano. Se lançarmos uma nova instância da Tarefa C a partir de B, C pertence à Tarefa 2 porque essa é a afinidade da tarefa da atividade raiz (neste caso, B). Mas e se agora tentarmos lançar A a partir de C na Tarefa 2? Como a afinidade de A é a Tarefa 1, mudamos da Tarefa 2 para a Tarefa 1, voltamos à Atividade A e finalmente passamos a intenção para A.

>

Knowing Single Task nos ajudará a entender melhor o modo de lançamento final; Single Instance. Tal como a Tarefa Única, uma Actividade com Instância Única pode ser a única Actividade em todas as tarefas. A diferença entre as duas é que uma Atividade com Instância Única também pode ser a única atividade em uma tarefa.

<activity android:name=".Activity_B"
android:launchMode="singleInstance"
android:taskAffinity="com.affinity.of.b"
/>

Neste exemplo, a Atividade B terá um modo de lançamento de Instância Única. A Atividade A na tarefa 1 lança a Atividade B. Isto faz com que a atividade B seja lançada em uma nova tarefa, que é então colocada em primeiro plano. A atividade B então lança a atividade C. Como uma instância única pode ser a única atividade em uma tarefa, C é lançada em cima da atividade A na tarefa 1, e então a tarefa 1 vem para o primeiro plano.

Afinidade da tarefa também desempenha um papel na Instância única. Se a atividade B não tem afinidade com a tarefa, um usuário não pode navegar de volta para a tarefa 1. Se a Atividade B tiver afinidade com a tarefa, um usuário será capaz de ir e voltar entre a tarefa 1 e 2.

Saber sobre modos de lançamento me ajuda a fazer melhores experiências UI/UX para meus usuários, e até me ajuda a resolver alguns bugs que arranham a cabeça, então espero que esta informação ajude você também!

Eu quero dar um grito à página do youtube do Anil Deshpande CodeTutor por me ajudar a entender melhor o conceito. Aqui está o primeiro de sete vídeos sobre este assunto: https://www.youtube.com/watch?v=m8sf0UkJkxo

Deixe um comentário