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.

questionAnswers(3)

yourAnswerToTheQuestion