web-dev-qa-db-fra.com

Android: Comment éviter de démarrer une activité déjà en pile?

Essayons d'expliquer ma question: J'ai une application et un service . L'application est lancée avec l'activité A . Le service envoie une diffusion qui laissera l'application démarrer l'activité B l'utilisateur commence l'activité C.

Maintenant, le service veut recommencer l’activité B. Mais comment lui faire savoir que l'activité est toujours sur la pile ou existe-t-il un indicateur d'intention pour cela?

Comment puis-je éviter qu'il lance l'activité B car il est déjà dans la pile?

47
Ion Aalbers

Je pense que vous devez rendre votre activité B singleInstance que, si elle est déjà créée, vous ne voulez pas créer à nouveau, c'est le mode de lancement de l'activité peut être défini dans le manifeste Android:launchMode qui définit le mode d'activité instanciée.

dans votre cas, utilisez Android:launchMode="singleInstance"

67
MKJParekh

Vous pouvez utiliser l'indicateur Intent.FLAG_ACTIVITY_NEW_TASK . Si l'activité est déjà en cours, elle sera mise au premier plan au lieu de créer une nouvelle activité.

Si vous ajoutez Intent.FLAG_ACTIVITY_CLEAR_TOP à ceci, toutes les activités qui suivent cette activité dans la pile seront effacées.

24

Si l'activité est déjà affichée si elle est déjà démarrée, activez le drapeau FLAG_ACTIVITY_SINGLE_TOP

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
mContext.startActivity(intent);
9
Pellet

Les approches Android:launchMode="singleInstance" et le simple ajout d’indicateurs à la Intent ne fonctionnent pas pour moi ..__

Dans le code où l'activité a commencé:

Intent intent = new Intent(activity, ActivityThatHasToBeStarted.class);
intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
startActivity(intent);

Dans la ActivityThatHasToBeStarted:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
        finish();
        return;
    }
    // Code for this creation
}
5
Andrey

Vous pouvez envisager d'utiliser Android:launchMode="singleTop" au lieu de Android:launchMode="singleInstance"Bon article sur les différences

2
Gal Rom

Si vous n'avez plus besoin de la deuxième activité, c'est une bonne pratique de la terminer. Vous devriez le faire pour la deuxième activité une fois l'opération terminée:

startActivity(new Intent(this, FirstActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
finish();
1
Alireza