É possível iniciar uma atividade na pilha, limpando todo o histórico antes dela?
A situação
Eu tenho uma pilha de atividades que vai A-> B-> C ou B-> C (a tela A seleciona o token de usuário, mas muitos usuários têm apenas um único token).
Na tela C, o usuário pode executar uma ação que invalida a tela B; portanto, o aplicativo deseja levá-los para a tela A, independentemente de já estar na pilha. A tela A deve ser o único item da pilha no meu aplicativo.
Notas
Existem muitas outras perguntas semelhantes, mas não encontrei nada que responda a essa pergunta exata. Tentei ligar getParent().finish()
- isso sempre resulta em uma exceção de ponteiro nulo. FLAG_ACTIVITY_CLEAR_TOP
só funciona se a atividade já estiver na pilha.
fonte
Caso 1: Apenas duas atividades A e B:
Aqui o fluxo da atividade é A-> B. Ao clicar no botão voltar de B, precisamos fechar o aplicativo e, ao iniciar a atividade B a partir de A, basta concluir (), isso impedirá o android de armazenar a atividade A no Backstack.eg para a atividade A Tela Loding / Splash do aplicativo.
Caso 2: Mais de duas atividades:
Se houver um fluxo como A-> B-> C-> D-> B e clicar no botão Voltar na Atividade B enquanto estiver vindo da Atividade D. Nesse caso, devemos usar.
Aqui, a Atividade B será iniciada a partir do backstack em vez de uma nova instância por causa do Intent.FLAG_ACTIVITY_CLEAR_TOP e Intent.FLAG_ACTIVITY_NEW_TASK limpa a pilha e a torna a primeira.
fonte
Com a versão mais recente do Android> = API 16, use
finishAffinity()
abordagem é adequada para> = API 16.
fonte
Também passei algumas horas nisso ... e concordo que FLAG_ACTIVITY_CLEAR_TOP soa como o que você deseja: limpe toda a pilha, exceto a atividade que está sendo iniciada, para que o botão Voltar saia do aplicativo. No entanto, como Mike Repass mencionou, FLAG_ACTIVITY_CLEAR_TOP só funciona quando a atividade que você está iniciando já está na pilha; quando a atividade não está lá, a bandeira não faz nada.
O que fazer? Coloque a atividade sendo iniciada na pilha com FLAG_ACTIVITY_NEW_TASK, que torna essa atividade o início de uma nova tarefa na pilha de histórico. Em seguida, adicione o sinalizador FLAG_ACTIVITY_CLEAR_TOP.
Agora, quando FLAG_ACTIVITY_CLEAR_TOP for encontrar a nova atividade na pilha, ela estará lá e será exibida antes que todo o resto seja limpo.
Aqui está a minha função de logout; o parâmetro View é o botão ao qual a função está conectada.
fonte
Você não deve mudar a pilha. O botão Voltar do Android deve funcionar como em um navegador da web.
Eu posso pensar em uma maneira de fazer isso, mas é um truque.
Faça suas atividades
singleTask
adicionando-as aoAndroidManifest
exemplo:Estenda o
Application
que manterá a lógica de onde ir.Exemplo:
De a para B:
De B a C:
Em C:
e segure o botão voltar para
pop()
da pilha.Mais uma vez, você não deve fazer isso :)
fonte
Application
ocorre em suas instâncias, o sistema operacional não poderá liberar a RAM restante das atividades destruídas.Imediatamente após iniciar uma nova atividade, use
startActivity
, certifique-se de ligarfinish()
para que a atividade atual não fique empilhada atrás da nova.fonte
Tente o seguinte:
fonte
Kotlin reutilizável avançado:
Você pode definir o sinalizador diretamente usando o método setter. No Kotlin
or
é o substituto para o Java bit a bit ou|
.Se você planeja usá-lo regularmente, crie uma função de extensão Intent
Você pode chamar diretamente essa função antes de iniciar a intenção
Se você precisar adicionar outros sinalizadores em outras situações, adicione um parâmetro opcional à função de extensão.
fonte
fonte
Experimente o código abaixo,
fonte
Para mim, nenhum dos métodos acima não funciona.
Faça isso para limpar todas as atividades anteriores :
fonte
Às vezes, o emulador do Android pode não conseguir conectar a ferramenta DDMS do eclipse e solicitar que o adb seja iniciado manualmente. Nesse caso, você pode iniciar ou parar o adb usando o prompt de comando.
fonte
Eu achei um hack muito simples, basta fazer isso, adicionar um novo elemento
AndroidManifest
como: -o
android:noHistory
limpará sua atividade indesejada do Stack.fonte