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?
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"
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.
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);
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
}
Vous pouvez envisager d'utiliser Android:launchMode="singleTop"
au lieu de Android:launchMode="singleInstance"
Bon article sur les différences
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();