Domanda

La mia applicazione ha le seguenti schermate di flusso:

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

Ora ho un pulsante log out comune in ogni schermata

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

Voglio che quando l'utente fa clic sul pulsante di disconnessione (da qualsiasi schermata), tutte le schermate saranno terminate e si aprirà una nuova schermata Log in.

Ho provato quasi tutti i FLAG_ACTIVITY per ottenere questo risultato. Eseguo anche alcune risposte in stackoverflow, ma non sono in grado di risolvere il problema. La mia applicazione è su Android 1.6 quindi non posso utilizzare FLAG_ACTIVITY_CLEAR_TASK

Esiste un modo per risolvere il problema?

È stato utile?

Soluzione

Usa:

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

Questo cancellerà tutte le attività in cima a casa.

Supponendo che tu stia finendo la schermata di accesso quando l'utente accede e viene creata la casa e successivamente tutte le schermate da 1 a 5 in cima a quella.Il codice che ho pubblicato ti riporterà alla schermata principale che completa tutte le altre attività.Puoi aggiungere un extra nell'intento e leggerlo nell'attività della schermata iniziale e finirlo anche (magari avviare di nuovo la schermata di accesso da lì o qualcosa del genere).

Non ne sono sicuro, ma puoi anche provare ad accedere con questo flag.Non so come verranno ordinate le attività in quel caso.Quindi non so se cancellerà quelli sotto lo schermo in cui ti trovi, incluso quello in cui ti trovi attualmente, ma è decisamente la strada da percorrere.

Spero che questo aiuti.

Altri suggerimenti

Puoi provare a Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK.Cancellerà completamente tutte le attività precedenti e inizierà una nuova attività.

Prima di avviare la tua nuova attività, aggiungi semplicemente il codice seguente:

finishAffinity();

Oppure, se desideri che funzioni nelle versioni precedenti di Android:

ActivityCompat.finishAffinity(this);

Quando l'utente desidera uscire da tutte le attività aperte , deve premere un pulsante che carica la prima attività che viene eseguita all'avvio dell'applicazione, cancellare tutte le altre attività, quindi terminare l'ultima attività rimanente . Eseguire il codice seguente quando l'utente preme il pulsante di uscita. Nel mio caso, LoginActivity è la prima attività da eseguire nel mio programma.

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

Il codice precedente cancella tutte le attività tranne LoginActivity. Quindi inserisci il seguente codice all'interno del LoginActivity del onCreate(...), per ascoltare quando LoginActivity viene ricreato e il segnale "EXIT" è stato passato:

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

Perché è così difficile creare un pulsante di uscita in Android?

Android si sforza di scoraggiarti dall'avere un pulsante di "uscita" nella tua applicazione, perché vogliono che l'utente non si preoccupi mai del fatto che i programmi che utilizzano siano in esecuzione o meno in background.

Gli sviluppatori del sistema operativo Android vogliono che il tuo programma sia in grado di sopravvivere a un arresto imprevisto e allo spegnimento del telefono e, quando l'utente riavvia il programma, riprende da dove si era interrotto. In questo modo l'utente può ricevere una telefonata mentre usa la tua applicazione e aprire mappe che richiedono che la tua applicazione venga liberata per ulteriori risorse.

Quando l'utente riprende la tua applicazione, riprende da dove aveva interrotto senza interruzioni. Questo pulsante di uscita sta usurpando l'alimentazione dal gestore delle attività, causando potenzialmente problemi con il ciclo di vita del programma Android gestito automaticamente.

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

Funzionerà per tutte le versioni di Android.Dove IntentCompat la classe aggiunta nella libreria del supporto Android.

Utilizza quanto segue per l'attività

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

rimuove il flag CLEAR_TASK per l'utilizzo dei frammenti.

Spero che questo possa essere utile per alcune persone.

Da developer.android.com :

public void finishAffinity ()

Aggiunto nel livello API 16

Completa questa attività e tutte le attività immediatamente sotto di essa nell'attività corrente che hanno la stessa affinità.Questo viene in genere utilizzato quando un'applicazione può essere avviata su un'altra attività (ad esempio da un'ACTION_VIEW di un tipo di contenuto che comprende) e l'utente ha utilizzato la navigazione verso l'alto per uscire dall'attività corrente e passare alla propria attività.In questo caso, se l'utente è passato a qualsiasi altra attività della seconda applicazione, tutte queste dovrebbero essere rimosse dall'attività originale come parte del cambio di attività.

Tieni presente che questa finitura non ti consente di fornire risultati all'attività precedente e verrà generata un'eccezione se stai cercando di farlo.

Immagino di essere in ritardo, ma la risposta è semplice e breve. Esiste un metodo finishAffinity () in Activity che terminerà l'attività corrente e tutte le attività principali, ma funziona solo in Android 4.1 o versioni successive.

Per API 16+, utilizza

finishAffinity();

Per meno di 16 anni, utilizza

ActivityCompat.finishAffinity(YourActivity.this);

Spero che aiuti!

In una nota a margine, buono a sapersi
Questa risposta funziona ( 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();

mentre questo non funziona

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

.setFlags() sostituisce eventuali flag precedenti e non aggiunge nuovi flag mentre .addFlags() lo fa.

Quindi anche questo funzionerà

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

Se la tua applicazione ha una versione sdk minima 16, puoi utilizzare finishAffinity()

Completa questa attività così come tutte le attività immediatamente sotto di essa nell'attività corrente che hanno la stessa affinità.

Questo per me funziona. Nella schermata Top Payment rimuovi tutte le attività back-stack,

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

http://developer.android.com/reference / android / app / Activity.html # finishAffinity% 28% 29

Una soluzione che ho implementato per questo (penso di averla trovata su Stack Overflow da qualche parte, ma non ricordo, quindi grazie a chi l'ha fatto in primo luogo):

Da qualsiasi tua attività fai questo:

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

Quindi in LoginActivity, sovrascrivi onKeyDown:

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

Per il pulsante di disconnessione sull'ultima schermata dell'app, utilizza questo codice sul listener del pulsante di disconnessione per terminare tutte le attività precedenti aperte e il problema è risolto.

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
genera codice tagore

ho lo stesso problema puoi usare IntentCompat, in questo modo:

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

questo codice funziona per me.

Android api 17

invece di utilizzare finish(), utilizza finishAffinity();

Nel mio caso utilizzo la funzione finishAffinity() nell'ultima attività come:

finishAffinity()
startHomeActivity()

Spero che sia utile.

Accedi> Home-> schermata 1-> schermata 2-> schermata 3-> schermata 4-> schermata 5

sullo schermo 4 (o qualsiasi altro) ->

StartActivity(Log in)
con
FLAG_ACTIVITY_CLEAR_TOP

per API>= da 15 a API 23 soluzione semplice.

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

Se stai utilizzando startActivityForResult() nelle tue attività precedenti, sovrascrivi semplicemente OnActivityResult() e chiama il metodo finish(); al suo interno in tutte le attività .. Questo farà il lavoro ...

Quando l'utente fa clic sul pulsante di disconnessione, scrivi il seguente codice:

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

E anche quando dopo il login se chiami nuova attività non usare finish ();

Semplicemente, quando esci dalla schermata di accesso, non quando finisci la schermata di accesso.

E poi in tutte le attività di inoltro, usa questo per il logout:

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

Funziona perfettamente.

Se accedi all'utente in screen 1 e da lì vai alle altre schermate, utilizza

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

Ho trovato in questo modo, cancellerà tutta la cronologia ed uscirà

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

Ho scoperto che questa soluzione funziona su ogni dispositivo nonostante il livello API (anche per <11)

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top