all - android view stack



Android: limpe a pilha de trás (20)

No Android eu tenho algumas atividades, digamos A, B, C.

Em A, eu uso esse código para abrir o B:

Intent intent = new Intent(this, B.class);
startActivity(intent);

Em B, eu uso esse código para abrir o C:

Intent intent = new Intent(this, C.class);
startActivity(intent);

Quando o usuário toca um botão em C, eu quero voltar para A e limpar a pilha de trás (feche B e C). Então, quando o usuário usar o botão Voltar, B e C não aparecerão, eu tenho tentado o seguinte:

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);

Mas B e C ainda estão aparecendo se eu usar o botão voltar quando eu estiver de volta à atividade A. Como posso evitar isso?

https://ffff65535.com


  1. Adicione android:launchMode="singleTop" ao elemento de atividade em seu manifesto da Atividade A
  2. Em seguida, use intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) e intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ao iniciar a atividade A

Isso significa que, quando a Atividade A é ativada, todas as tarefas sobre ela são limpas, de modo que A seja superior. Uma nova pilha de back-ups é criada com A na raiz, e o uso de singleTop garante que você só lança A uma vez (já que A está no topo devido a ..._CLEAR_TOP ).



Adicionar nenhum sinalizador de histórico na intenção.

Na atividade B, inicie a atividade C como abaixo >>>>>>

Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(intent);
finish();

Adicione isto à sua Activity B e Activity C

android:noHistory="true"

ou onBackPressed função onBackPressed para evitar voltar pressionando com um return .

@Override
public void onBackPressed() {
   return;
}

Como por Wakka em Removendo uma atividade da pilha de histórico ...

Adicione o atributo android:noHistory="true" ao seu <activity> no AndroidManifest.xml assim:

    <activity android:name=".MyActivity"
        android:noHistory="true">
    </activity>

Em kotlin é quase igual a java. Somente | símbolo é substituído por ou texto. Então, está escrito como-

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)

Eu encontrei uma solução interessante que pode ajudar. Eu fiz isso no meu método onBackPressed() .

finishAffinity();
finish();

FinishAffinity remove a conexão da atividade existente à sua pilha. E depois terminar ajuda você a sair dessa atividade. Que acabará por sair do aplicativo.


Eu tentei todas as soluções e nenhuma funcionou individualmente para mim. Minha solução é:

Declare Activity A como SingleTop usando [android:launchMode="singleTop"] no manifesto do Android.

Agora adicione os seguintes sinalizadores ao iniciar o A de qualquer lugar. Isso limpará a pilha.

Intent in = new Intent(mContext, A.class);
in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
startActivity(in);
finish();

Isso me incomoda há muito tempo. Finalmente trabalhei fazendo isso:

Em fragmento, use:

Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

Em Atividade, use (adicione mais um sinalizador Intent.FLAG_ACTIVITY_CLEAR_TASK comparado ao fragmento):

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

No manifesto

android:launchMode="singleTask"

e

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Para pesquisas futuras, tente este código.

Intent intent = new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();

Parece-me que você precisa iniciar a Activity C da Activity B usando startActivityForResult() . Ao clicar em um botão na Activity C , chame setResult(RESULT_OK) e finish() para que a Activity C seja finalizada. Na Activity B , você pode ter o onActivityResult() respondendo também chamando finish() em si mesmo, e então você será levado de volta à Activity A


Se seu aplicativo tiver o mínimo de versão do SDK 16, você poderá usar finishAffinity ()

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

Isso é trabalho para mim Na tela Top Payment, remova todas as atividades de 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


Tente adicionar FLAG_ACTIVITY_NEW_TASK conforme descrito nos documentos para FLAG_ACTIVITY_CLEAR_TOP :

Esse modo de inicialização também pode ser usado para um bom efeito em conjunto com FLAG_ACTIVITY_NEW_TASK: se usado para iniciar a atividade de raiz de uma tarefa, ela trará qualquer instância atualmente em execução dessa tarefa para o primeiro plano e a limpará para seu estado raiz. Isso é especialmente útil, por exemplo, ao iniciar uma atividade do gerenciador de notificações.

Então, seu código para iniciar o A seria:

Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
finish(); // call this to finish the current activity

Use finishAffinity (); na tarefa C ao iniciar a tarefa A para limpar as atividades de backstack.


Você pode usar este exemplo para chamar sua Activity A da Activity C

Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);


use este código para iniciar uma nova atividade e fechar ou destruir todas as outras pilhas de acivity ou back satack ...

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

Intent.FLAG_ACTIVITY_CLEAR_TOP não funcionará neste caso. Por favor use (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)

Para mais detalhes, confira this documentação.


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

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




clear