Android: Clear Activity Stack

J’ai plusieurs activités dans ma candidature. et le stream est très compliqué. Lorsque je clique sur l’application Déconnexion de naviagates pour vous connecter à l’écran et à partir de là, l’utilisateur peut quitter en annulant le buton (en appelant system.exit(0) )

quand je quitte ou que je retourne sur le bouton, le système appelle une activité de la stack 🙁 comment puis-je effacer toutes les activités de la stack lorsque j’atteins l’écran de connexion? calling finish() n’est pas pratique car il y a beaucoup d’activités fermés lorsqu’ils sont actifs, par exemple une activité invoquant une caméra native.

 validateuser logoutuser = new validateuser(); logoutuser.logOut(); Intent loginscreen = new Intent(homepage.this, Login2.class); (homepage.this).finish(); loginscreen.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(loginscreen); 

La plupart d’entre vous ont tort. Si vous souhaitez fermer une stack d’activités existante, quel que soit son contenu, et créer une nouvelle racine, le jeu de drapeaux correct est le suivant:

 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

De la doc :

public static final int FLAG_ACTIVITY_CLEAR_TASK
Ajouté dans l’API niveau 11

S’il est défini dans Intent passé à Context.startActivity() , cet indicateur entraîne l’ Context.startActivity() toute tâche existante associée à l’activité avant le démarrage de l’activité. En d’autres termes, l’activité devient la nouvelle racine d’une tâche par ailleurs vide et toutes les anciennes activités sont terminées. Ceci ne peut être utilisé qu’avec FLAG_ACTIVITY_NEW_TASK .

Lorsque vous appelez startActivity à la dernière activité, vous pouvez toujours utiliser

Intent.FLAG_ACTIVITY_CLEAR_TOP

comme un drapeau sur cette intention.

En savoir plus sur le drapeau ici .

Voici une méthode d’assistance simple pour démarrer une nouvelle activité en tant que nouvelle activité supérieure qui fonctionne à partir de l’API de niveau 4 jusqu’à la version actuelle 17:

 static void startNewMainActivity(Activity currentActivity, Class< ? extends Activity> newTopActivityClass) { Intent intent = new Intent(currentActivity, newTopActivityClass); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) intent.addFlags(0x8000); // equal to Intent.FLAG_ACTIVITY_CLEAR_TASK which is only available from API level 11 currentActivity.startActivity(intent); } 

Appelez-le ainsi de votre activité actuelle:

 startNewMainActivity(this, MainActivity.class); 

Effacer l’activité Backstate par le code ci-dessous:

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

Terminé

Dans mon cas, LoginActivity était également fermé. Par conséquent,

 Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK 

n’a pas aidé.

Cependant, réglage

 Intent.FLAG_ACTIVITY_NEW_TASK 

m’a aidé.

 Intent intent = new Intent(LoginActivity.this, Home.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //It is use to finish current activity startActivity(intent); this.finish(); 

J’ai noté que vous avez demandé une solution qui ne repose pas sur finish() , mais je me demande si cela peut néanmoins aider.

J’ai vérifié si un indicateur de sortie est déclenché avec une variable de classe statique, qui survit à la durée de vie totale de l’application. Dans chaque activité de onResume() , utilisez

 @Override public void onResume() { super.onResume(); if (ExitHelper.isExitFlagRaised) { this.finish(); } } 

La classe ExitHelper

 public class ExitHelper { public static boolean isExitFlagRaised = false; } 

Disons que dans mainActivity, un utilisateur appuie sur un bouton pour quitter – vous pouvez définir ExitHelper.isExitFlagRaised = true; et puis finish() . Par la suite, les autres activités pertinentes qui sont automatiquement resockets seront également terminées.

Cette décision fonctionne bien:

 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

Mais les nouvelles activités se lancent longtemps et vous voyez un écran blanc quelque temps. Si cela est critique, utilisez cette solution de contournement:

 public class BaseActivity extends AppCompatActivity { private static final Ssortingng ACTION_FINISH = "action_finish"; private BroadcastReceiver finisBroadcastReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); registerReceiver(finisBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { finish(); } }, new IntentFilter(ACTION_FINISH)); } public void clearBackStack() { sendBroadcast(new Intent(ACTION_FINISH)); } @Override protected void onDestroy() { unregisterReceiver(finisBroadcastReceiver); super.onDestroy(); } } 

Comment l’utiliser:

 public class ActivityA extends BaseActivity { // Click any button public void startActivityB() { startActivity(new Intent(this, ActivityB.class)); clearBackStack(); } } 

Inconvénient: toutes les activités qui doivent être fermées sur la stack doivent étendre BaseActivity

Pour les développeurs Xamarin, vous pouvez utiliser:

 intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask);