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"/>
>