web-dev-qa-db-fra.com

Comment éviter de revenir à l'activité précédente?

Lorsque vous appuyez sur le bouton RETOUR du téléphone, je souhaite empêcher une activité donnée de revenir à la précédente.

Plus précisément, j'ai des écrans de connexion et d'inscription, les deux commencent une nouvelle activité appelée HomeScreen lorsque la connexion/inscription réussie se produit. Une fois HomeScreen démarré, je souhaite empêcher les utilisateurs de pouvoir revenir aux écrans de connexion ou d’enregistrement en appuyant sur la touche RETOUR. 

J'ai essayé d'utiliser Intent.FLAG_ACTIVITY_NO_HISTORY, mais étant donné que l'application possède une intégration de Facebook, lorsque l'option "Connexion avec Facebook" est utilisée, Facebook doit revenir à l'écran de connexion initial. Par conséquent, je dois conserver un historique de ces activités.

J'ai pensé à remplacer le comportement du bouton RETOUR sur HomeScreen pour terminer directement une application lorsque le bouton est enfoncé et que j'ai utilisé

@Override
public void onBackPressed() {
    finish();
}

mais cela ne fonctionne pas non plus.

178
ecem

Ma suggestion serait de terminer l'activité à laquelle vous ne voulez pas que les utilisateurs reviennent. Par exemple, dans votre activité de connexion, juste après avoir appelé startActivity, appelez finish(). Lorsque les utilisateurs appuient sur le bouton Précédent, ils ne pourront pas accéder à l'activité de connexion, car celle-ci a été supprimée.

309
coder

La solution suivante peut être très utile dans le scénario de connexion/activité principale habituel ou dans la mise en place d’un écran de blocage.

Pour minimiser l'application plutôt que de revenir à l'activité précédente, vous pouvez remplacer onBackPressed() comme ceci:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

moveTaskToBack(boolean nonRoot) laisse votre pile arrière en l'état, met simplement votre tâche (toutes les activités) en arrière-plan. Identique à l’utilisation du bouton Home par l’utilisateur .

Paramètre boolean nonRoot - Si la valeur est false, cela ne fonctionne que si l'activité est la racine d'une tâche. Si true, cela fonctionnera pour n'importe quelle activité dans une tâche.

91
Marcel Bro

Je ne sais pas exactement ce que vous voulez, mais cela semble être possible, et vous semblez déjà être sur la bonne voie.

Voici quelques liens qui pourraient vous aider:

Désactiver le bouton Précédent sous Android

  MyActivity.Java =>
    @Override
    public void onBackPressed() {

       return;
    }

Comment puis-je désactiver le retour à une activité?

  AndroidManifest.xml =>
<activity Android:name=".SplashActivity" Android:noHistory="true"/>
32
paulsm4

Il existe deux solutions à votre cas, l'activité A commence l'activité B, mais vous ne souhaitez pas revenir à l'activité A de l'activité B.

1. Suppression de l'activité précédente A de la pile arrière.

    Intent intent = new Intent(activityA.this, activityB.class);
    startActivity(intent);
    finish(); // Destroy activity A and not exist in Back stack

2. Action désactivée avec le bouton Précédent dans l'activité B.

Il y a deux manières d'empêcher un retour en arrière comme ci-dessous,

1) Recommander l'approche

@Override
public void onBackPressed() {
}

2) Remplacer la méthode onKeyDown

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK) {
        return false;
    }
    return super.onKeyDown(keyCode, event);
}

J'espère que c'est utile, mais que cela dépend toujours de votre situation. 

13
Luna Kong

finish() vous donne la méthode pour fermer l'activité actuelle, pas l'application complète. Et vous feriez mieux de ne pas chercher de méthodes pour tuer les applications. Petit conseil.

Avez-vous essayé la conjonction de Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY? N'oubliez pas d'utiliser ces drapeaux dans l'activité de départ Intent!

5
cadavre

Mettez finish() juste après 

Intent i = new Intent(Summary1.this,MainActivity.class);
            startActivity(i);
finish();
3
Param Trivedi

Cette méthode fonctionne bien

Intent intent = new Intent(Profile.this, MainActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
2
pulak

la réponse de paulsm4 est la bonne. Si vous retournez simplement dans onBackPressed(), le bouton Précédent sera désactivé. Cependant, je pense qu’une meilleure approche, compte tenu de votre cas d’utilisation, consiste à inverser la logique de l’activité, c’est-à-dire faire de votre activité à domicile la principale, vérifier si l’utilisateur est connecté, sinon démarrez-la. La raison en est que si vous remplacez le bouton Précédent dans votre activité principale, la plupart des utilisateurs seront confus s’ils appuient sur le bouton précédent et votre application ne fait rien. 

2
dmon

Si vous ne souhaitez pas revenir à toutes les activités de votre application, vous pouvez utiliser 

Android:launchMode="singleTask"

En savoir plus ici: http://developer.Android.com/guide/topics/manifest/activity-element.html

2
asok Buzz

Puisqu'il y a déjà beaucoup de bonnes solutions suggérées, les malades essaient de donner une explication plus dictée.

Comment sauter pour revenir à l'activité précédente?

Supprimer l'activité précédente de Backstack. Simple

Comment supprimer l'activité précédente de Backstack?

Appelez la méthode finish()

Le flux normal:

 enter image description here 
Toutes les activités sont stockées dans une pile appelée Backstack.
Lorsque vous démarrez une nouvelle activité (startActivity(...)), celle-ci est poussée en haut de la pile et lorsque vous appuyez sur le bouton précédent, elle est extraite de la pile.
Un point clé à noter est que lorsque le bouton Précédent est enfoncé, la méthode finish(); est appelée en interne. C'est le comportement par défaut de la méthode onBackPressed ().

Donc, si vous voulez ignorer l'activité B?

c'est-à-dire A <--- C

Il suffit d'ajouter la méthode finish(); après votre startActvity(...) dans l'activité B

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

 enter image description here 

1
Rohit Singh

Remplacez simplement la méthode onKeyDown et vérifiez si le bouton Précédent a été enfoncé.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    {
        //Back buttons was pressed, do whatever logic you want
    }

    return false;
}
1
Machine Tribe

Mettre

finish();

Juste après ActivityStart pour arrêter l'activité en empêchant tout moyen d'y revenir. Puis ajouter

onCreate(){
    getActionBar().setDisplayHomeAsUpEnabled(false);
    ...
}

Pour l'activité que vous commencez. 

0
Brandon Dyer
@Override
public void onBackPressed() {
}

Lorsque vous créez onBackPressed(), supprimez simplement super.onBackPressed(); et cela devrait fonctionner.

0
hyperCoder