Quais são as diferenças entre FLAG_ACTIVITY_RESET_TASK_IF_NEEDED e FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP?
Estou no processo de (finalmente) escrever o capítulo sobre tarefas para o meu livro e estou encontrando alguns quebra-cabeças remanescentes.
O que funciona como iniciador de tela inicial parece usar a combinação deFLAG_ACTIVITY_NEW_TASK
eFLAG_ACTIVITY_RESET_TASK_IF_NEEDED
quando eles iniciam a atividade solicitada do iniciador:
Intent i=new Intent(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
i.setComponent(name);
startActivity(i);
A documentação paraFLAG_ACTIVITY_RESET_TASK_IF_NEEDED
tem:
Se definida, e essa atividade estiver sendo iniciada em uma nova tarefa ou trazendo para o topo uma tarefa existente, ela será iniciada como a porta da frente da tarefa. Isso resultará na aplicação de quaisquer afinidades necessárias para que a tarefa esteja no estado apropriado (movendo atividades para ou a partir dela) ou simplesmente redefinindo a tarefa para seu estado inicial, se necessário.
Isso não é especialmente claro.
Em particular, parece que os mesmos efeitos seriam vistos usando uma combinação deFLAG_ACTIVITY_CLEAR_TOP
eFLAG_ACTIVITY_SINGLE_TOP
. Citando os documentos paraFLAG_ACTIVITY_CLEAR_TOP
:
Se definido, e a atividade lançada já estiver em execução na tarefa atual, em vez de iniciar uma nova instância dessa atividade, todas as outras atividades sobre ela serão fechadas e esse Intent será entregue ao (agora em top) atividade antiga como uma nova Intenção ...
A instância atualmente em execução da [atividade desejada] receberá a nova intenção que você está iniciando aqui no método onNewIntent () ou será finalizada e reiniciada com a nova intenção. Se ele declarou seu modo de inicialização como "múltiplo" (o padrão) e você não definiu FLAG_ACTIVITY_SINGLE_TOP na mesma intenção, ele será finalizado e recriado; para todos os outros modos de inicialização ou se FLAG_ACTIVITY_SINGLE_TOP estiver definido, esse Intent será entregue à onNewIntent () da instância atual.
oFLAG_ACTIVITY_CLEAR_TOP
documentação faz sentido, pelo menos para mim.
Então, o que fazFLAG_ACTIVITY_RESET_TASK_IF_NEEDED
fazer isso é diferente da combinação deFLAG_ACTIVITY_CLEAR_TOP
eFLAG_ACTIVITY_SINGLE_TOP
?
Pontos de bônus se você puder explicar o queFLAG_ACTIVITY_CLEAR_TASK
isso é diferente de qualquer uma das outras duas opções descritas acima.
Se definido em um Intent passado para Context.startActivity (), esse sinalizador fará com que qualquer tarefa existente que esteja associada à atividade seja limpa antes que a atividade seja iniciada. Ou seja, a atividade se torna a nova raiz de uma tarefa vazia e quaisquer atividades antigas são concluídas. Isso pode ser usado apenas em conjunto com FLAG_ACTIVITY_NEW_TASK.
Uma diferença óbvia entre isso eFLAG_ACTIVITY_CLEAR_TOP
| FLAG_ACTIVITY_SINGLE_TOP
é aqueleFLAG_ACTIVITY_CLEAR_TASK
necessidadesFLAG_ACTIVITY_NEW_TASK
. Mas, além disso, parece que os efeitos líquidos são os mesmos e também correspondemFLAG_ACTIVITY_RESET_TASK_IF_NEEDED
.