Domanda

Ho un'applicazione con diverse attività in Android e voglio che l'utente sia in grado di accedere, premendo un pulsante del menu. Il problema che ho è che

A) Android non consente di terminare l'applicazione e
B) anche quando mando l'utente al LoginActivity di nuovo si può sempre premere Indietro e tornare a destra con l'attività precedente erano in.

Ho già provato a lanciare l'attività con le due seguenti flag:

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

Ho anche provato con ognuno di loro a parte.

Inoltre ho provato a chiamare finish() dopo startActivity(intent) come ho letto in un altro StackOverflow domanda.

È stato utile?

Soluzione

Nella vostra attività di accesso, ignorare il pulsante indietro, in modo che nasconde la vostra applicazione invece di finire l'attività:

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

Anche assicurarsi di impostare Android. AlwaysRetainTaskState = "true" l'attività principale, in modo da Android non cancella il tuo stack (inclusa l'attività di login) dopo 30 minuti di inattività da utente

Poi basta chiamare finitura () quando c'è un login riuscito.

Altri suggerimenti

Questo dovrebbe essere bit a bit in OR o si finisce per sovrascrivere la bandiera precedente.

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

In questo modo:

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

Come per Wakka in Rimozione di un'attività dalla storia pila ...


Aggiungi attributo android:noHistory="true" al <activity> nel AndroidManifest.xml in questo modo:

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

Se si utilizza Android API 11 o superiore, è possibile utilizzare il seguente codice per cancellare lo stack.

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

questo voleva svuotare la pila attività di schiena.

Anche dopo aver seguito tutta la risposta di cui sopra, quando ho premuto il pulsante indietro Ha dimostrato l'ultima attività per un secondo prima di chiudere l'applicazione.

Questo è quello che ho fatto:

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

Ora le mie uscite app su stampa indietro :) senza alcun problema.

Impostazione Intent.FLAG_ACTIVITY_CLEAR_TOP ha lavorato per me in un caso molto simile, dove non ho impostato il flag Intent.FLAG_ACTIVITY_NEW_TASK. Hai provato senza?

Questo lavoro per me:)

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

Dove A è la mia attività principale, ad esempio

Ho Attività A -> B -> C -> D quando chiamo iniziare l'attività e sulla pila ho ora A -> E

Non so è un bene :) ma opere.

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

scrivere questo e nota: LoginActivity deve essere lanciato prima come Launcher e

se si scrive qualsiasi modalità di avvio le bandiere vengono sovrascritti il ??suo scopo, in modo da rimuovere il launchermode e provare sarà sicuramente ottenere

Prova questo

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

Se usiamo questo codice per avviare attività di accesso (A):

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

L'attività dovrebbe essere nella pila di attività, altrimenti questo flag non avranno alcun effetto.

Se usiamo finitura () in attività di accesso (A), dopo aver lanciato l'attività (B) (per evitare di tornare a A da B), l'attività di A (Login) non sarà nello stack. Esattamente lo stesso accade quando l'attività di accesso ha "noHistory" come attributo.

Quindi, la soluzione per me è stato un mix di altre risposte:

Questo codice va nell'attività B, per evitare di tornare all'attività login:

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

E questo codice va nella attività che chiama la funzione di logout:

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top