Question

J'ai une application avec plusieurs activités dans Android et je veux que l'utilisateur soit en mesure d'ouvrir une session en appuyant sur un bouton de menu. Le problème est que je

A) Android ne vous laissez pas arrêter l'application et
B), même lorsque j'envoie l'utilisateur à la LoginActivity à nouveau, ils peuvent toujours appuyer sur retour et retourner droit à l'activité précédente ils étaient.

Je l'ai déjà essayé de lancer l'activité avec les deux drapeaux suivants:

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

J'ai aussi essayé avec chacun d'entre eux par eux-mêmes.

J'ai aussi essayé d'appeler finish() après startActivity(intent) comme je l'ai lu dans un autre StackOverflow question.

Était-ce utile?

La solution

Dans votre activité de connexion, remplacer le bouton de retour, il cache votre application au lieu de terminer l'activité:

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

Assurez-vous également à jeu Android:. AlwaysRetainTaskState = « true » sur l'activité de la racine, donc Android ne voit pas clairement votre pile (y compris l'activité de connexion) après 30 minutes d'inactivité de l'utilisateur

Ensuite, il suffit d'appeler finish () quand il y a une connexion réussie.

Autres conseils

Cela devrait être ou vous bitwise séparées par OR finir par écraser le drapeau plus tôt.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

comme ceci:

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

Wakka Suppression d'une activité de la pile historique ...


Ajouter attribut android:noHistory="true" à votre <activity> dans le AndroidManifest.xml comme ceci:

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

Si vous utilisez Android API 11 ou au-dessus, vous pouvez utiliser le code suivant pour effacer la pile.

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

Ce ne vais pas effacer votre dos d'activité pile.

Même après avoir suivi toute la réponse ci-dessus, quand j'appuyé sur le bouton de retour Il a montré la dernière activité pour une seconde avant de fermer l'application.

Voici ce que je faisais:

@Override
public void onBackPressed() { 
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(startMain);
}

Maintenant, mes sorties app sur la presse en arrière :) sans aucun tracas.

Réglage Intent.FLAG_ACTIVITY_CLEAR_TOP a travaillé pour moi dans un cas similaire, où je ne l'ai pas mis le drapeau Intent.FLAG_ACTIVITY_NEW_TASK. Avez-vous essayé sans?

Ce travail pour moi:)

Intent main = new Intent(this, A_Activity.class);
main.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
    | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(main);

Intent tool = new Intent(this, B_Activity.class);
startActivity(tool);
finish();

Où A est mon activité racine par exemple

J'ai des activités A -> B -> C -> D quand je l'appelle l'activité début E sur la pile, je maintenant A -> E

Je ne sais pas est-ce bon :) mais fonctionne.

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

écrire et veuillez noter: LoginActivity doit être lancé d'abord comme lanceur et

si vous écrivez des modes lanceur les drapeaux sont écrasés son but, donc supprimer le launchermode et essayez vous allez sûrement obtenir

Essayer cette

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);

Si nous utilisons ce code pour lancer une activité Login (A):

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

L'activité devrait être dans la pile d'activités, sinon ce drapeaux n'auront aucun effet.

Si nous utilisons la finition () dans l'activité Connexion (A), après l'activité lancement (B) (pour éviter d'aller à A de B), l'activité A (Connexion) ne sera pas dans la pile. Exactement la même chose se produit lorsque l'activité de connexion a « Nohistory » comme attribut.

Alors, la solution pour moi était un mélange d'autres réponses:

Ce code va dans le B d'activité, afin d'éviter de revenir à l'activité de connexion:

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

Et ce code va dans l'activité qui appelle la fonction de fermeture de session:

public static void logout() {
    Intent intent = new Intent(activity, LoginMain.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top