Pergunta

Meu aplicativo possui as seguintes telas de fluxo:

Home->screen 1->screen 2->screen 3->screen 4->screen 5

Agora eu tenho um botão log out comum em cada tela

(Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5)

Desejo que quando o usuário clicar no botão de logout (de qualquer tela), todas as telas serão concluídas e uma nova tela Log in será aberta.

Eu tentei quase todos os FLAG_ACTIVITY para fazer isso. Também analiso algumas respostas em stackoverflow, mas não consigo resolver o problema. Meu aplicativo está no Android 1.6, portanto, não posso usar FLAG_ACTIVITY_CLEAR_TASK

Existe alguma maneira de resolver o problema?

Foi útil?

Solução

Use:

Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Isso limpará todas as atividades da casa.

Supondo que você esteja finalizando a tela de login quando o usuário se logar e a página inicial for criada e depois todas as telas de 1 a 5 em cima dessa.O código que postei o levará de volta à tela inicial finalizando todas as outras atividades.Você pode adicionar um extra no intent e ler isso na atividade da tela inicial e finalizá-lo também (talvez abra a tela de login novamente a partir daí ou algo assim).

Não tenho certeza, mas você também pode tentar fazer o login com este sinalizador.Não sei como as atividades serão ordenadas nesse caso.Portanto, não sei se irá limpar os que estão abaixo da tela em que você está, incluindo aquela em que você está, mas é definitivamente o caminho a seguir.

Espero que isso ajude.

Outras dicas

Você pode tentar Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK.Ele limpará totalmente todas as atividades anteriores e iniciará uma nova atividade.

Antes de iniciar sua nova atividade, basta adicionar o seguinte código:

finishAffinity();

Ou se você quiser que funcione em versões anteriores do Android:

ActivityCompat.finishAffinity(this);

Quando o usuário deseja sair de todas as atividades abertas , ele deve pressionar um botão que carrega a primeira atividade executada quando seu aplicativo é iniciado, limpar todas as outras atividades e, em seguida, terminar a última atividade restante . Faça com que o código a seguir seja executado quando o usuário pressionar o botão de saída. No meu caso, LoginActivity é a primeira atividade em meu programa a ser executada.

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

O código acima limpa todas as atividades, exceto LoginActivity. Em seguida, coloque o seguinte código dentro do LoginActivity do onCreate(...), para ouvir quando LoginActivity for recriado e o sinal 'EXIT' for passado:

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();  
}

Por que criar um botão de saída no Android é tão difícil?

O Android se esforça para desencorajar você a ter um botão "sair" em seu aplicativo, porque eles querem que o usuário nunca se preocupe se os programas que usa estão ou não em execução em segundo plano.

Os desenvolvedores do sistema operacional Android desejam que seu programa sobreviva a um desligamento inesperado do telefone e, quando o usuário reinicia o programa, ele continua de onde parou. Assim, o usuário pode receber uma chamada enquanto usa seu aplicativo e abrir mapas que exigem que seu aplicativo seja liberado para mais recursos.

Quando o usuário retoma o aplicativo, ele continua de onde parou, sem interrupção. Este botão de saída está usurpando a energia do gerenciador de atividades, podendo causar problemas com o ciclo de vida do programa Android gerenciado automaticamente.

Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

Isso funcionará para todas as versões do Android.Onde IntentCompat a classe adicionada na biblioteca de suporte do Android.

Use o seguinte para a atividade

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

remover a sinalização CLEAR_TASK para uso do fragmento.

Espero que isso seja útil para algumas pessoas.

De developer.android.com :

public void finishAffinity ()

Adicionado na API de nível 16

Conclua esta atividade, bem como todas as atividades imediatamente abaixo dela na tarefa atual que tenham a mesma afinidade.Isso normalmente é 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 usou a navegação para cima para sair da tarefa atual e entrar em sua própria tarefa.Nesse caso, se o usuário navegou para baixo em qualquer outra atividade do segundo aplicativo, todas elas devem ser removidas da tarefa original como parte da troca de tarefas.

Observe que esse acabamento não permite que você forneça resultados para a atividade anterior, e uma exceção será lançada se você estiver tentando fazer isso.

Acho que estou atrasado, mas a resposta é simples e curta. Há um método finishAffinity () em Activity que terminará a atividade atual e todas as atividades principais, mas funciona apenas no Android 4.1 ou superior.

Para API 16+, use

finishAffinity();

Para menos de 16 anos, use

ActivityCompat.finishAffinity(YourActivity.this);

Espero que ajude!

Como observação, é bom saber
Esta resposta funciona ( https://stackoverflow.com/a/13468685/7034327 )

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
this.finish();

Considerando que isso não funciona

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

.setFlags() substitui quaisquer sinalizadores anteriores e não acrescenta nenhum sinalizador novo, enquanto .addFlags() o faz.

Portanto, isso também funcionará

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Se seu aplicativo tiver no mínimo SDK versão 16, você pode usar finishAffinity()

Conclua esta atividade, bem como todas as atividades imediatamente abaixo dela na tarefa atual que tenham a mesma afinidade.

Isso funciona para mim, a tela de pagamento inicial remove todas as atividades back-stack,

@Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.android.com/reference / android / app / Activity.html # finishAffinity% 28% 29

Uma solução que implementei para isso (acho que encontrei no Stack Overflow em algum lugar, mas não me lembro, então, graças a quem fez isso em primeiro lugar):

Faça o seguinte em qualquer uma de suas atividades:

// Clear your session, remove preferences, etc.
Intent intent  = new Intent(getBaseContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Em seguida, em sua LoginActivity, sobrescreva onKeyDown:

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

Para o botão de logout na última tela do aplicativo, use este código no listener do botão de logout para concluir todas as atividades anteriores abertas e seu problema será resolvido.

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
    Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();

eu tenho o mesmo problema você pode usar IntentCompat, como este:

import android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

este código funciona para mim.

Android api 17

em vez de usar finish(), use apenas finishAffinity();

No meu caso, eu uso a função finishAffinity() na última atividade como:

finishAffinity()
startHomeActivity()

Espero que seja útil.

Faça login em> Página inicial-> tela 1-> tela 2-> tela 3-> tela 4-> tela 5

na tela 4 (ou qualquer outro) ->

StartActivity(Log in)
com
FLAG_ACTIVITY_CLEAR_TOP

para API>= 15 a API 23 solução simples.

 Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
 nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
 startActivity(nextScreen);
 ActivityCompat.finishAffinity(currentActivity.this);

Se você estiver usando startActivityForResult() em suas atividades anteriores, apenas substitua OnActivityResult() e chame o método finish(); dentro dele em todas as atividades. Isso fará o trabalho ...

Quando o usuário clicar no botão de logout, escreva o seguinte código:

Intent intent = new Intent(this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

E também quando, após o login, você chamar uma nova atividade, não use terminar ();

Simplesmente, quando você sai da tela de login, não quando termina a tela de login.

E então em todas as atividades de encaminhamento, use isto para logout:

final Intent intent = new Intent(getBaseContext(), LoginScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);

Funciona perfeitamente.

Se você logar o usuário em screen 1 e de lá for para as outras telas, use

Intent intent = new Intent(this, Screen1.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Eu encontrei desta forma, limpará todo o histórico e sairá

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
Intent intent = new Intent(getApplicationContext(), SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

finish();
System.exit(0);

Descobri que essa solução funciona em todos os dispositivos, independentemente do nível de API (mesmo para <11)

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top