Question

Mon application a les écrans de flux suivants:

Home->screen 1->screen 2->screen 3->screen 4->screen 5

Maintenant, j'ai un bouton log out commun dans chaque écrans

(Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5)

Je veux que lorsque l'utilisateur clique sur le bouton déconnexion (depuis tout écran), tous les écrans seront terminés et une nouvelle Log in écran ouvrira.

J'ai essayé presque tous FLAG_ACTIVITY pour y parvenir. Je vais aussi par quelques réponses à stackoverflow, mais ne pas être en mesure de résoudre le problème. Mon application est sur Android 1.6 afin de ne pas être en mesure d'utiliser FLAG_ACTIVITY_CLEAR_TASK

Est-il possible de résoudre le problème?

Était-ce utile?

La solution

Utilisation:

Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Cela effacera toutes les activités sur le dessus de la maison.

En supposant que vous terminez l'écran de connexion lorsque l'utilisateur se connecte à la maison et est créé et ensuite tous les écrans de 1 à 5 sur le dessus de celui-ci. Le code i posté vous revenir à l'écran d'accueil de finition toutes les autres activités. Vous pouvez ajouter un supplémentaire dans l'intention et de lire que l'activité de l'écran d'accueil et terminer aussi (peut-être l'écran de connexion de lancement à nouveau à partir de là ou quelque chose).

Je ne suis pas sûr, mais vous pouvez aussi essayer d'aller ouvrir une session avec ce drapeau. Je ne sais pas comment les activités seront commandées dans ce cas. Donc, je ne sais pas si cela effacera les dessous de l'écran, vous êtes sur, y compris celui que vous êtes actuellement, mais sa certainement le chemin à parcourir.

Hope this helps.

Autres conseils

Vous pouvez essayer Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK. Il efface totalement toutes les activités précédent (s) et commencer une nouvelle activité.

Avant de lancer votre nouvelle activité, il suffit d'ajouter le code suivant:

finishAffinity();

Ou si vous voulez travailler dans les versions précédentes d'Android:

ActivityCompat.finishAffinity(this);

Lorsque l'utilisateur souhaite quitter toutes les activités ouvertes , ils doivent appuyer sur un bouton qui charge la première activité qui fonctionne au démarrage de votre application, désactivez toutes les autres activités, ont alors la dernière arrivée d'activité restante . Avoir l'exécution de code suivant lorsque l'utilisateur appuie sur le bouton de sortie. Dans mon cas, LoginActivity est la première activité dans mon programme à exécuter.

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

Le code ci-dessus efface toutes les activités, sauf pour LoginActivity. Ensuite, placez le code suivant dans la LoginActivity du onCreate(...), à écouter quand LoginActivity est recréée et le signal « EXIT » a été adoptée:

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();  
}

Pourquoi fait un bouton de sortie dans Android si dur?

Android tente difficile de vous décourager d'avoir un bouton « sortie » dans votre application, parce qu'ils veulent l'utilisateur de ne jamais se soucier de savoir si oui ou non les programmes qu'ils utilisent sont en cours d'exécution en arrière-plan ou non.

Les développeurs Android OS veulent que votre programme soit en mesure de survivre à un arrêt inattendu et hors tension du téléphone, et lorsque l'utilisateur redémarre le programme, ils prennent là où ils l'avaient laissé. Ainsi, l'utilisateur peut recevoir un appel téléphonique alors qu'ils utilisent votre application, et des cartes ouvertes qui exige que votre demande soit libéré pour plus de ressources.

Lorsque l'utilisateur reprend votre application, ils prennent là où ils ont laissé sans interruption. Ce bouton de sortie est usurpé le pouvoir du directeur de l'activité, ce qui pourrait causer des problèmes avec le cycle de vie du programme Android gérés automatiquement.

Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

Ce travail pour toutes les versions Android. Où IntentCompat la classe ajoutée dans la bibliothèque de soutien Android.

Utilisez les indications suivantes pour l'activité

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

Supprimer le drapeau CLEAR_TASK pour fragment.

J'espère que cela peut utiliser pour certaines personnes.

De developer.android.com :

public void finishAffinity ()

Ajouté au niveau de l'API 16

Terminer cette activité, ainsi que toutes les activités immédiatement au-dessous de la tâche en cours qui ont la même affinité. Ceci est généralement utilisé lorsqu'une application peut être lancée à une autre tâche (par exemple à partir d'un ACTION_VIEW d'un type de contenu qu'il comprend) et l'utilisateur a utilisé la navigation jusqu'à passer hors de la tâche en cours et à sa propre tâche. Dans ce cas, si l'utilisateur a navigué vers le bas dans toute autre activité de la deuxième application, tous ceux-ci devraient être retirés de la tâche d'origine dans le cadre du changement de tâche.

Notez que cette finition ne vous permet pas de produire des résultats à l'activité précédente, et une exception sera levée si vous essayez de le faire.

Je suppose que je suis en retard, mais il est simple et courte réponse. Il existe une méthode finishAffinity () dans l'activité qui terminera l'activité en cours et toutes les activités parents, mais il ne fonctionne que dans Android 4.1 ou supérieur.

Pour API 16+, utilisez

finishAffinity();

Pour en dessous de 16, l'utilisation

ActivityCompat.finishAffinity(YourActivity.this);

it helps!

Sur une note de côté, bon de savoir
Cela fonctionne de réponse ( https://stackoverflow.com/a/13468685/7034327 )

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
this.finish();

alors que cela ne fonctionne pas

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

.setFlags() remplace les drapeaux précédents et ne pas ajouter de nouveaux drapeaux tout .addFlags() fait.

Alors ce sera aussi le travail

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Si votre application a la version minimale de 16 sdk vous pouvez alors utiliser finishAffinity ()

Terminer cette activité, ainsi que toutes les activités immédiatement au-dessous de la tâche en cours qui ont la même affinité.

Ce travail est pour moi dans le Top écran de paiement supprimer toutes les arrière-pile activits,

@Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.android.com/ référence / android / app / Activity.html # finishAffinity% 28% 29

Une solution pour ce que je mis en œuvre (je crois que je l'ai trouvé sur Stack Overflow quelque part, mais je ne me souviens pas, donc merci à celui qui a fait que, en premier lieu):

De toutes vos activités font ceci:

// Clear your session, remove preferences, etc.
Intent intent  = new Intent(getBaseContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Ensuite, dans votre LoginActivity, écrasez onKeyDown:

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

Pour le bouton de fermeture de session à l'écran dernier application, utilisez ce code sur écoute bouton de fermeture de session pour terminer toutes les activités ouvertes précédentes, et votre problème est résolu.

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
    Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();

J'ai même problème vous pouvez utiliser IntentCompat, comme ceci:

import android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

ce travail de code pour moi.

applications api 17

au lieu d'utiliser finish() il suffit d'utiliser finishAffinity();

Dans mon cas, j'utilise la fonction finishAffinity() dans la dernière activité comme:

finishAffinity()
startHomeActivity()

Je espère que ça sera utile.

Log in-> Maison-> écran 1-> écran 2-> 3- écran> écran 4-> écran 5

sur l'écran 4 (ou tout autre) ->

StartActivity(Log in)
avec
FLAG_ACTIVITY_CLEAR_TOP

pour API> = 15 à 23 API solution simple.

 Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
 nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
 startActivity(nextScreen);
 ActivityCompat.finishAffinity(currentActivity.this);

Si vous utilisez startActivityForResult() dans vos activités précédentes, juste passer outre OnActivityResult() et appeler la méthode finish(); à l'intérieur dans toutes les activités .. Cela va faire le travail ...

Lorsque l'utilisateur clique sur le bouton de fermeture de session puis écrire le code suivant:

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

Et quand après la connexion si vous appelez une nouvelle activité ne pas utiliser la finition ();

Simplement, quand vous allez à l'écran de connexion, pas lors de la finition de l'écran de connexion.

Et puis dans toutes les activités vers l'avant, l'utiliser pour fermeture de session:

final Intent intent = new Intent(getBaseContext(), LoginScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);

Il fonctionne parfaitement.

Si vous vous connectez à l'utilisateur screen 1 et à partir de là vous allez dans les autres écrans, utilisez

Intent intent = new Intent(this, Screen1.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Je trouve cette façon, il va effacer toute l'histoire et la sortie

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
Intent intent = new Intent(getApplicationContext(), SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

finish();
System.exit(0);

J'ai trouvé que cette solution fonctionne sur tous les appareils, malgré le niveau de l'API (même pour <11)

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top