Meu aplicativo possui as seguintes telas de fluxo:
Home->screen 1->screen 2->screen 3->screen 4->screen 5
Agora eu tenho um log out
botão comum em cada tela
( Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5
)
Quero que, quando o usuário clicar no botão de logout (de qualquer tela), todas as telas sejam finalizadas e uma nova tela Log in
seja aberta.
Eu tentei quase tudo FLAG_ACTIVITY
para conseguir isso. Também passo por algumas respostas no stackoverflow, mas não consegui resolver o problema. Meu aplicativo está no Android 1.6, portanto, não posso usarFLAG_ACTIVITY_CLEAR_TASK
Existe alguma maneira de resolver o problema?
Respostas:
Usar:
Isso limpará todas as atividades em cima da casa.
Supondo que você esteja finalizando a tela de login quando o usuário efetuar login e a página inicial for criada e depois todas as telas de 1 a 5 em cima dessa. O código que eu publiquei retornará à tela inicial, finalizando todas as outras atividades. Você pode adicionar um extra na intenção e ler na atividade da tela inicial e finalizá-la também (talvez inicie a tela de login novamente a partir daí ou algo assim).
Não tenho certeza, mas você também pode tentar acessar com esta bandeira. Não sei como as atividades serão ordenadas nesse caso. Portanto, não sei se ele limpará os que estão abaixo da tela em que você está, incluindo o que você está atualmente, mas é definitivamente o caminho a percorrer.
Espero que isto ajude.
fonte
singleInstance
, considere usarFLAG_ACTIVITY_CLEAR_TOP|FLAG_ACTIVITY_SINGLE_TOP
como sinalizadores para a Intenção. Isso terminará as atividades intermediárias e iniciará (ou trará de volta ao primeiro plano) a atividade desejada.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
à minha atividade não me ajudou.Ele não concluiu as atividades intermediárias.Quando pressiono a tela de login, consigo ver as atividades anteriores.Aqui está o meu códigoIntent intent=new Intent(BaseActivity.this, Login.class);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);startActivity(intent);
.Você pode tentar
Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK
. Ele limpa totalmente todas as atividades anteriores e inicia uma nova atividade.fonte
Antes de iniciar sua nova atividade, basta adicionar o seguinte código:
Ou se você deseja que ele funcione nas versões anteriores do Android:
fonte
Quando o usuário deseja sair de todas as atividades abertas , ele deve pressionar um botão que carrega a primeira Atividade executada quando o aplicativo é iniciado, limpar todas as outras atividades e concluir a última atividade restante. Execute o código a seguir quando o usuário pressionar o botão sair. No meu caso,
LoginActivity
é a primeira atividade do meu programa a ser executada.O código acima limpa todas as atividades, exceto
LoginActivity
. Em seguida, coloque o seguinte código dentro doLoginActivity
'sonCreate(...)
, para ouvir quandoLoginActivity
é recriado e o sinal' EXIT 'foi passado:Por que tornar tão difícil um botão de saída no Android?
O Android se esforça para desencorajá-lo a ter um botão "exit" em seu aplicativo, porque eles querem que o usuário nunca se importe com a execução ou não dos programas que eles usam em segundo plano.
Os desenvolvedores do sistema operacional Android desejam que seu programa seja capaz de sobreviver a um desligamento inesperado e desligue o telefone e, quando o usuário reinicia o programa, ele retoma exatamente de onde parou. Assim, o usuário pode receber uma ligação enquanto usa seu aplicativo e abrir mapas que exigem que seu aplicativo seja liberado para obter mais recursos.
Quando o usuário retoma seu aplicativo, ele retoma exatamente de onde parou sem interrupção. Esse botão de saída está consumindo energia do gerenciador de atividades, causando problemas no ciclo de vida do programa Android gerenciado automaticamente.
fonte
Isso funcionará para todas as versões do Android. Onde
IntentCompat
a classe foi adicionada na biblioteca de suporte do Android.fonte
IntentCompat.FLAG_ACTIVITY_CLEAR_TASK
não é reconhecido, use emIntent
vez deIntentCompat
.Use o seguinte para atividade
remova o sinalizador CLEAR_TASK para uso de fragmentos.
Espero que isso possa ser usado para algumas pessoas.
fonte
Acho que estou atrasado, mas há uma resposta simples e curta. Existe um método finishAffinity () em Activity que finaliza a atividade atual e todas as atividades pai, mas funciona apenas no Android 4.1 ou superior.
Para API 16+, use
finishAffinity();
Para menores de 16 anos, use
ActivityCompat.finishAffinity(YourActivity.this);
Espero que ajude!
fonte
De developer.android.com :
Conclua esta atividade e todas as atividades imediatamente abaixo dela na tarefa atual que possui a mesma afinidade. Isso geralmente é usado quando um aplicativo pode ser iniciado em outra tarefa (como de um ACTION_VIEW de um tipo de conteúdo que ele entende) e o usuário usa a navegação para sair da tarefa atual e fazer sua própria tarefa. Nesse caso, se o usuário tiver navegado para outras atividades do segundo aplicativo, todas elas deverão ser removidas da tarefa original como parte da alternância de tarefas.
Observe que esse acabamento não permite que você entregue resultados à atividade anterior e uma exceção será lançada se você estiver tentando fazê-lo.
fonte
Por outro lado, é bom saber
Esta resposta funciona ( https://stackoverflow.com/a/13468685/7034327 )
enquanto isso não funciona
.setFlags()
substitui os sinalizadores anteriores e não acrescenta novos sinalizadores enquanto o.addFlags()
faz.Então isso também vai funcionar
fonte
Se o seu aplicativo tiver no mínimo a versão 16 do sdk, você poderá usar finishAffinity ()
Conclua esta atividade e todas as atividades imediatamente abaixo dela na tarefa atual que possui a mesma afinidade.
Isso é bom para mim. Na tela Pagamento principal, remova todas as atividades de pilha traseira,
http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29
fonte
Uma solução que eu implementei para isso (acho que a encontrei no Stack Overflow em algum lugar, mas não me lembro, então, graças a quem fez isso em primeiro lugar):
De qualquer uma de suas atividades, faça o seguinte:
Em seu LoginActivity, substitua onKeyDown:
fonte
Para o botão de logout na última tela do aplicativo, use este código no ouvinte do botão de logout para concluir todas as atividades anteriores abertas e seu problema foi resolvido.
fonte
fonte
setFlags
substituirá todos os anteriores; portanto, o últimosetFlags
só será válido; os anteriores serão substituídos. Então você não precisa ligari1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
Eu tenho o mesmo problema que você pode usar
IntentCompat
, assim:esse código funciona para mim.
Api Android 17
fonte
No meu caso, eu uso a
finishAffinity()
função na última atividade como:Espero que seja útil.
fonte
em vez de usar
finish()
apenas usefinishAffinity();
fonte
Entre -> tela inicial-> tela 1-> tela 2-> tela 3-> tela 4-> tela 5
na tela 4 (ou qualquer outra) ->
comfonte
para API> = 15 a API 23 solução simples.
fonte
Se você estiver usando
startActivityForResult()
em suas atividades anteriores, basta substituirOnActivityResult()
e chamar ofinish();
método dentro dele em todas as atividades. Isso fará o trabalho ...fonte
startActivity
apenas.onActivityResult
em cada atividade. Implementei a sugestão de DArkO e alcancei meu objetivo e obrigado pela ajuda.Quando o usuário clicar no botão logout, escreva o seguinte código:
E também quando após o login, se você chamar uma nova atividade, não use finish ();
fonte
Simplesmente, quando você sai da tela de login, não ao terminar a tela de login.
E, em todas as atividades avançadas, use isto para logout:
Funciona perfeitamente.
fonte
Se você fizer o login do usuário
screen 1
e, a partir daí, for para as outras telas, usefonte
onKeyDown
eonBackPressed
(ouonKeyDown
, se desejar oferecer suporte a versões do Android <2.0) em cada uma de suas atividades (exceto a de logon) estartActivity(login)
, como mostrado acima.Eu encontrei assim, vai limpar todo o histórico e sair
fonte
Acho que estou atrasado, mas há uma resposta simples e curta. Existe um método finishAffinity () em Activity que finaliza a atividade atual e todas as atividades pai, mas funciona apenas no Android 4.1 ou superior.
Para API 16+, use
finishAffinity ();
Para menores de 16 anos, use
ActivityCompat.finishAffinity (YourActivity.this);
Espero que ajude!
O shareedit respondeu em 27 de maio de 18 às 8:03
Akshay Taru
fonte
Encontrei esta solução para trabalhar em todos os dispositivos, apesar do nível da API (mesmo para <11)
fonte
Melhor maneira de fechar todas as atividades anteriores e limpar a memória
fonte
fonte