Come cancellare la Pila Android di attività?
-
10-10-2019 - |
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.
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);
}